父类中没有覆盖变量

时间:2011-05-12 01:30:35

标签: php oop

查看AN EMPTY ARRAY的代码。任何人都可以告诉我为什么该数组为空并且在执行以下代码时没有从AccountModel填充

$accountModel->setEmail('test@test.com');

class AccountModel extends Model {
protected   $table = 'account',
            $key = 'id',
            $data = array(
                'id' => null,
                'email' => null,
                'first_name' => null,
                'created' => null,
                'last_login' => null,
                'hash' => null
            );
}


class Model extends CI_Model {
    protected $table = null;
    protected $key = null;
    protected $connection = null;
    protected $data = array();

public function __call ($function, $arguments) {
    $original = $function;
    $function = strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $function));

    $prefix = substr($function, 0, 4); //returns get_ or set_

    if ($prefix == 'get_' || $prefix == 'set_') {
        $key = substr($function, 4); //returns "email" 
        var_dump($this->data); //AN EMPTY ARRAY
        exit($key);
    }

    throw new Exception('Call to undefined method '.get_class($this).'::'.$original.'()');
}
}

根据example 2 on PHP.net,它应该可以正常工作。

我正在尝试运行$ accountModel-&gt; setEmail('test@test.com');

更新:我已经意识到我的代码中存在另一个错误,但我失败了。感谢帮助人员

4 个答案:

答案 0 :(得分:2)

看来,您的$ accountModel不属于AccountModel类:尝试类似var_dump(get_class($this))

的内容
<?php
class Animal {
    public $data = 'i`m animal';
    protected $_data = 'i`m animal';

    public function go() {
        var_dump($this->data);
        var_dump($this->_data);
    }

    public function __call ($function, $arguments) {
        echo 'I was called as ' . $function . PHP_EOL;
        var_dump($this->data);
        var_dump($this->_data);
    }
}

class Cat extends Animal {
    public $data = 'i`m cat';
    protected $_data = 'i`m cat';
}

$pussy = new Cat();
$pussy->go();
$pussy->iamMagicMethod();

答案 1 :(得分:0)

你正在向后看待继承。您的Model类没有$ data数组。它无法从AccountModel“看到”$ data数组,因为继承只是一种方式。父母无法看到孩子中定义的成员。

答案 2 :(得分:0)

You Are- Account Model中$ data的定义隐藏了Model中的数据。只是不要再次定义它,因为它已经存在于基类中。在构造函数初始化它:

class AccountModel extends Model {
    public function __construct()
    {
        $this->table = 'account';
        $this->key = 'id';
        $this->data = array(
            'id' => null,
            'email' => null,
            'first_name' => null,
            'created' => null,
            'last_login' => null,
            'hash' => null
            );
    }

}

答案 3 :(得分:0)

你的问题被打破了:this approach does work

我怀疑您的$accountModel实际上不是 AccountModel类型的对象。

另一个指向这一点的证据是,尝试创建AccountModel是代码中的错误,因为您在 Model的类定义之前定义它这取决于它。毕竟,你不能这样做。

如果您仍然遇到问题,请在ideone.com上发布一个可以明显再现该问题的测试用例。