PHP проверяет, установлены ли значения массива - PullRequest
1 голос
/ 27 мая 2011

У меня есть следующая функция:

public function insertMember($username, $password, $fname, $lname)
    {
        $param              = array();
        $param['username']  = $username;
        $param['password']  = $password;
        $param['fname']     = $fname;
        $param['lname']     = $lname;
        return (count(array_filter($param, 'strlen')) == 0) ? FALSE : $this->insertIntoDB($param);
    }

Использует ли (count(array_filter($param, 'strlen')) == 0) правильный / лучший способ проверить, все ли переменные $username, $password, $fname, $lname переданы в функцию?

Спасибо
Pav

Ответы [ 7 ]

1 голос
/ 27 мая 2011

Вы не можете действительно проверить, были ли переменные переданы в функцию или нет, вы можете только проверить их значение. Если значение равно falsey , вы можете отклонить его. Это не обязательно означает, что переменная не была передана, просто значение было falsey .

if (!$username || !$password || !$fname || !$lname)

Чтобы еще больше ограничить его и принять, например, пустые строки и 0 в качестве допустимых значений, сделайте что-то вроде:

public function insertMember($username = null, $password = null, $fname = null, $lname = null) {
    if ($username === null || $password === null || $fname === null || $lname === null)

Наилучшим способом может быть принятие массива, который вы можете явно проверить на наличие ключей независимо от их значений:

public function insertMember($values) {
    if (array_diff_key(array_flip(array('username', 'password', 'fname', 'lname')), $values)) {
        // not all keys were set!
    }

Независимо от этого:

$param             = array();
$param['username'] = $username;
$param['password'] = $password;
$param['fname']    = $fname;
$param['lname']    = $lname;

можно сократить до:

$params = compact('username', 'password', 'fname', 'lname');
1 голос
/ 22 сентября 2012
if(count(array_filter($array)) == 0)
//   all values are empty 
1 голос
/ 27 мая 2011

Я предпочитаю не использовать array_filter, потому что кажется немного грязным передавать функцию по ее имени.Хотя, если вы используете функции stdlib, все может быть в порядке.

Я бы использовал цикл

foreach ($param as $v) {
    if (empty($v)) return false;
}
1 голос
/ 27 мая 2011

Это не проверит достоверность данных, но:

// Do something if 4 (all) arguments were passed in
if(func_num_args() == 4) {
}
1 голос
/ 27 мая 2011

Почему бы не поставить свой чек еще раньше? Сделайте что-то вроде этого:

public function insertMember($username, $password, $fname, $lname) {
    if (!$username || !$password || !$fname || !lname) {
        return false;
    } else {
        $param = array();
        $param['username'] = $username;
        $param['password'] = $password;
        $param['fname'] = $fname;
        $param['lname'] = $lname;
        return $this->insertIntoDB($param);
    }
}
1 голос
/ 27 мая 2011

Вы можете опустить параметр 'strlen', поведение по умолчанию array_filter будет нормально работать в этом случае.Таким образом, код становится чуть короче.

Однако, в качестве стиля вы можете рассмотреть явное

if (empty($username) || empty($password) || ...)

, потому что оно более легко сообщает читателю, какие требованияфункции в отношении своих аргументов.

1 голос
/ 27 мая 2011

Возможно, верно, но не лучше.
Если вам нужно проверить все переменные:

if (empty($username) || empty($password) || empty($fname) || empty($lname)) return false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...