这似乎是一个愚蠢而微不足道的问题。我在PHP中遇到问题命名函数。我有两个功能,可以根据其ID或姓名和电子邮件检索学生的所有信息。
由于PHP没有与JAVA相同的函数重载,因此我很难命名函数。
这就是我所做的。这些是我给他们的名字。
get_students_with_id($id)
和get_students_with_name_and_email($name, $email)
但参数会增加。我需要一个更好,更简单的解决方案来命名这些函数或方法。顺便说一句,他们都属于同一类。那我该怎么办?提前致谢。
答案 0 :(得分:2)
在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"
答案 1 :(得分:1)
为什么不对你的其他参数使用get_students($id=0, $name='', $email='')
等,然后让函数根据传递的参数做任何必要的事情?
如果变得过多,则通过数组检查键。因此,如果array('id' => 1)
被传递,那么if (array_key_exists('id', $input)) {...}
将捕获它并继续进行实际的函数工作,但是如果传递了其他键/值,则后续适当的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;
}
}
答案 2 :(得分:1)
我会使用一个类而不是多个函数
class Student
{
public static function byName($name)
{
// ...
}
public static function byId($id)
{
// ...
}
}
$student = Student::byName('joe');
这样可以使它更清晰,更可扩展,因为您可以将常用逻辑放在类中受保护的静态方法中。
如果你想做多次,你可以做一些更复杂的链接。
我嘲笑了一个你可以逆向工程的快速构思:
答案 3 :(得分:1)
搜索方法可能看起来像这样:
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',
]);
您可能希望以更安全的方式处理数据(例如,确保密码是经过哈希处理的),但总体思路就在那里。