如何给 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.
中受保护的静态方法中
如果你想做倍数,你可以做一些更复杂的链接。
我模拟了一个快速的想法,你可以对其进行逆向工程:
搜索方法可能看起来像这样:
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',
]);
您可能希望以更安全的方式处理数据(例如,确保密码经过哈希处理),但总体思路就在那里。
这似乎是一个愚蠢而微不足道的问题。我在 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.
中受保护的静态方法中如果你想做倍数,你可以做一些更复杂的链接。
我模拟了一个快速的想法,你可以对其进行逆向工程:
搜索方法可能看起来像这样:
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',
]);
您可能希望以更安全的方式处理数据(例如,确保密码经过哈希处理),但总体思路就在那里。