CakePHP - пример кода кажется мне странным, что мне не хватает? - PullRequest
0 голосов
/ 01 сентября 2011

Прикрепленный код взят из пекарни cakephp, , где кто-то загрузил образец о пользовательских правилах проверки.

class Contact extends AppModel
{
    var $name = 'Contact';
    var $validate = array(
        'email' => array(
            'identicalFieldValues' => array(
                 'rule'    => array('identicalFieldValues', 'confirm_email' ),
                 'message' => 'Please re-enter your password twice so that the values match'
                )
            )
        );


    function identicalFieldValues( $field=array(), $compare_field=null ) 
    {
        foreach( $field as $key => $value ){
            $v1 = $value;
            $v2 = $this->data[$this->name][ $compare_field ];                 
            if($v1 !== $v2) {
                return FALSE;
            } else {
                continue;
            }
        }
        return TRUE;
    }

} 

В коде парень использовал foreach для доступа к члену массива, которыйу него уже было его имя!Насколько я понимаю - это пустая трата ресурсов и плохая (даже странная) практика.

Еще одна вещь о коде: я не понимаю использования там continue.это массив из одного поля, не так ли?сравнение должно произойти один раз, и цикл закончится.Пожалуйста, просветите меня.

1 Ответ

1 голос
/ 01 сентября 2011

В коде парень использовал foreach для доступа к элементу массива, имя которого у него уже было!Насколько я понимаю - это пустая трата ресурсов и плохая (даже странная) практика.

Первый параметр - это всегда массив с одним ключом и его значением, второй параметр - это результат вызова этой функции.в блоке, называемом ключом ... Итак, все, что вам нужно, это отправить ключ и не нужно итерировать

Код использует foreach для итерации по $field, чтомассив из одной пары ключ-значение.Все начинается, когда подпрограмма проверки вызывает identicalFieldValues, передавая ей два значения - $field, которые будут выглядеть как массив:

array ( 
    [email] => 'user entered value 1'
)

Второй параметр $compare_field будет установлен вstring confirm_email.

В данном конкретном случае не похоже, что имеет смысл использовать foreach, поскольку в вашем массиве есть только одна пара ключ-значение.Но вы должны написать код таким образом, потому что CakePHP будет передавать массив методу.

Я полагаю, что причина, почему CakePHP делает это, заключается в том, что массив - единственный способ передать и имя поля, и его значение.Хотя в этом случае имя поля (электронная почта) не имеет значения, в других случаях вам может понадобиться.

То, что вы видите здесь, является одним из предостережений при использовании фреймворков.В большинстве случаев они упрощают ваш код.Но иногда вам приходится писать код, который вы не могли бы написать нормально, просто чтобы фреймворк был доволен.


Еще одна вещь о коде: я не понимаю использование продолжениятам.это массив из одного поля, не так ли?сравнение должно произойти один раз, и цикл закончится.Пожалуйста, просветите меня.

Действительно.А поскольку в цикле foreach, следующего за continue, нет операторов, весь блок else также может быть опущен.

Упрощенная версия этого будет:

function identicalFieldValues($field=array(), $compare_field=null) 
{
    foreach ($field as $field) {

        $compare = $this->data[$this->name][$compare_field];                 
        if ($field !== $compare) {
            return FALSE;
        } 
    }
    return TRUE;
}

И я согласен с вами, цикл проходит только одну итерацию при проверке поля email. независимо от поля.Вам все еще нужен foreach, потому что вы получаете массив, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...