如何给 PHP 中的函数起有意义的名字?

How to give meaningful names to functions in PHP?

这似乎是一个愚蠢而微不足道的问题。我在 PHP 中命名函数时遇到问题。我有两个函数可以根据学生的 ID 或姓名和电子邮件检索学生的所有信息。

由于 PHP 没有与 JAVA 相同意义上的函数重载,因此我很难命名这些函数。

这是我所做的。这些是我给他们起的名字。

get_students_with_id($id)get_students_with_name_and_email($name, $email)

但是参数会增加。我需要一个更好、更简单的解决方案来命名这些函数或方法。顺便说一句,它们都属于同一个 class。那我该怎么办?提前致谢。

为什么不对其他参数使用 get_students($id=0, $name='', $email='') 等,然后让函数根据传递的参数执行任何必要的操作?

如果这变得太多,请通过数组检查键。因此,如果传递了 array('id' => 1),则 if (array_key_exists('id', $input)) {...} 将捕获它并继续执行实际的函数工作,但如果传递了其他 keys/values,则随后的适当 elseif 将捕获它。

更新:根据我在问题中阅读的一些评论,我认为这样的格式可能能够处理您的大部分用例。不确定您的数据库是什么,所以这是在考虑 MySQL 的情况下完成的。

function get_students($input) {
    $where = array();
    $allowed_columns = array('id', 'name', 'email');

    foreach ($allowed_columns as $key) {
        if (!array_key_exists($key, $input)) continue;
        $where[] = "`$key` = '" . mysqli_escape_string($input[$key]) . "'";
    }

    if ($where) {
        $query = 'SELECT ... FROM `...` WHERE ' . join(' AND ', $where);
        // etc...
    } else {
        return false;
    }
}

在PHP中不存在例如JAVA中的方法覆盖的概念,但是你可以发送默认参数,例如:

get_students($id, $name = null, $email = null)

这意味着您不需要调用带有三个参数的函数。你可以通过只用一个调用它来做到这一点,它会假设它是 id。例如,如果你想让一个函数为你上面的例子工作,你可以这样做:

function get_students($id, $name = null, $email) {
  if (!empty($id)) {
    // Get students by their ids
  } else if (!empty($name) && !empty($email)) {
    // Get students by their names and emails
  }
}

你可以调用上面的函数:

get_students(1); //Will retrieve studen with id 1
get_students(null, "Name", "email@email.com"); //Will retrieve students with name "Name" and email "email@email.com"

我会使用一个 class 而不是多个函数

class Student
{
    public static function byName($name)
    {
        // ...
    }

    public static function byId($id)
    {
        // ...
    }
}

$student = Student::byName('joe');

这将使它变得更加清晰和可扩展,因为您可以将通用逻辑放在 class.

中受保护的静态方法中

如果你想做倍数,你可以做一些更复杂的链接。

我模拟了一个快速的想法,你可以对其进行逆向工程:

http://ideone.com/duafK4

搜索方法可能看起来像这样:

class Student {

    public static $columns =  ['id', 'name', 'email', 'password', /* ... */];

    // Imagine that this method is called with the following array:
    // ['name' => 'Joe', 'password' => 'Pa55w0rD']
    public static function search(array $queries) {

        // We will be appending WHERE clauses to this SQL query
        $sql = 'SELECT * FROM students WHERE ';

        // Get the column names
        $parameters = array_keys($queries);

        // Create a parameterized WHERE clause for each column
        foreach ($parameters as & $param) {
            if ( ! in_array($param, self::$columns)) {
                throw "Invalid column";
            }
            $param = "{$param} = :{$param}";
        }
        // Squish parameterized WHERE clauses into one
        // and append it to the SQL query
        $sql .= implode(' AND ', $parameters);

        // The query will now look something like this:
        //     SELECT * FROM students WHERE name = :name AND password = :password

        // Prepare the SQL query
        $stmt = DB::instance()->prepare($sql);

        // Go over the queries and bind the values to the columns
        foreach ($queries as $col => $val) {
            $stmt->bindValue(":" . $col, $val);
            // Internally the query will look something like this:
            //     SELECT * FROM students WHERE name = 'Joe' AND password = 'Pa55w0rD'
        }
        // Execute
        $result = $stmt->execute();
        // ...
    }
}

要使用该方法,您需要执行以下操作:

$student = Student::search([
    'name'     => 'Joe',
    'password' => 'Pa55w0rD',
]);

您可能希望以更安全的方式处理数据(例如,确保密码经过哈希处理),但总体思路就在那里。