CakePHP - 一个代码示例对我来说很奇怪,我缺少什么?

时间:2011-09-01 00:31:08

标签: php cakephp

附加代码taken from cakephp bakery,,其中有人上传了有关自定义验证规则的示例。

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 个答案:

答案 0 :(得分:1)

  

在代码中,这个人用foreach来访问一个他已经知名的数组成员!据我了解 - 这是浪费资源和做坏事(甚至是奇怪的)。

     

第一个参数总是一个键上的数组及其值,第二个参数来自对该函数的调用,在一个名为key的块中...所以,你需要的只是发送键而不是需要迭代

代码使用foreach来遍历$field,这是一个键值对的数组。这一切都在验证例程调用identicalFieldValues时启动,并传递两个值 - $field,这将是一个看起来像这样的数组:

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

第二个参数$compare_field将设置为字符串confirm_email

在这种特殊情况下,使用foreach看起来并不是很有意义,因为您的数组只有一个键值对。但是你必须以这种方式编写代码,因为CakePHP 将数组传递给方法。

我相信CakePHP之所以这样做是因为数组是传递字段名称及其值的唯一方法。虽然在这种情况下,字段名称(电子邮件)是无关紧要的,但在其他情况下可能需要。

您在这里看到的是使用框架的一个注意事项。大多数情况下,它们会简化您的代码。但有时候你必须编写一些你不会正常编写的代码,这样框架就会很开心。


  

关于代码还有一件事:我不明白继续在那里使用。它是一个单场阵列,不是吗?比较应该发生一次,循环结束。请赐教。

事实上。由于continue之后的foreach循环中没有语句,因此也可以省略整个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,因为您正在获取数组。