【问题标题】:Bind outside variable and in Class protected field with method param使用方法参数绑定外部变量和类受保护字段
【发布时间】:2014-10-24 13:49:49
【问题描述】:

如何实现这种功能:

  • 填充实体,例如。 Member 有数据
  • Member$form->bind($member)绑定到私有属性_formData
  • 然后在 $form 中做一些事情,例如。 $form->validate()_formData
  • $member 也应该随着_formData 的变化而变化。

    class Form {
    
        private $_formData;
    
        function bind1(&$row) {
            // this change member outside
            $row['full_name'] =
                $row['first_name']
                . ' ' .
                $row['last_name'];
        }
    
        function bind2(&$row) {
            $this->_formData = $row;
            // this will not change memeber
            $this->_formData['full_name'] =
                $this->_formData['first_name']
                . ' '
                . $this->_formData['last_name'];
        }
    }
    
    $member = array('full_name' => null, 'first_name'=>'Fn', 'last_name' => 'Ln');
    $form = new Form();
    
    $form->bind1($member);
    var_dump($member['full_name']);
    // output: 'FnLn'
    
    $form->bind2($member);
    var_dump($member['full_name']);
    // output: null
    

方法 validate 与私有 _fieldData 一起工作,所以这个工作 bind2 测试应该工作。

【问题讨论】:

    标签: php pass-by-reference


    【解决方案1】:

    您尝试做的事情是可能的,但是您需要在 bind1 和 bind2 方法中设置引用的引用,如下所示:

    $this->_formData = & $row;
    

    您还在 full_namefullName 之间将拼写错误作为数组键。例如在bind2 方法中:

    $this->_formData['full_name'] =  $this->_formData['first_name'] . ' ' . $this->_formData['last_name'];
    

    在你的测试代码中你 var_dump full_name。将 bind2 中的 full_name 更改为 fullName 应该可以解决您的问题。

    【讨论】:

    • 是的! $this->_formData = &$row; 已解决。分配私有 _formData 并通过引用传递 also **&**$row 是有效的解决方案。想要自我回答,但这种方式更好:) 其他部分并不重要(拼写错误) - 只是测试代码。
    【解决方案2】:

    问题是您正在分配成员变量的 full_name 键并尝试访问 fullName 变量,因此它返回 NULL

    【讨论】:

    • 很抱歉。这部分只是在问题代码中拼写错误。 null 你说得对,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2010-11-02
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2011-03-29
    • 2020-01-31
    • 2010-09-30
    相关资源
    最近更新 更多