如何为PHP中的函数赋予有意义的名称?

时间:2015-07-07 03:25:57

标签: php function methods naming-conventions php-5.5

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

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

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

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

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

4 个答案:

答案 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');

这样可以使它更清晰,更可扩展,因为您可以将常用逻辑放在类中受保护的静态方法中。

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

我嘲笑了一个你可以逆向工程的快速构思:

http://ideone.com/duafK4

答案 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',
]);

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