使用方法参数绑定外部变量和Class受保护字段

时间:2014-10-24 13:49:50

标签: php pass-by-reference

如何实现此类功能:

  • 填写实体,例如。 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测试应该可行。

2 个答案:

答案 0 :(得分:0)

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

$this->_formData = & $row;

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

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

在你的测试代码中你有var_dump full_name。将full_name中的bind2追溯到fullName可以解决您的问题。

答案 1 :(得分:0)

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