为什么我的二传手不警告该物业无法设置?

时间:2015-02-02 08:38:55

标签: php extending-classes

在课程a中,我定义了setter。在类b中,它扩展了类a,因此有一个private变量,因此类a将无法查看。此代码中的setter类中的a永远不会将变量test设置为与初始值不同的值,因为它无法到达它。如果您运行此代码,对于案例A,它将输出0

但是,如果您运行案例B,则会得到Exception,说明属性test2不存在。

<?php

error_reporting(E_ALL);
ini_set('display_errors', true);

class a {
    public function __set($prop, $value) {
    if((!property_exists($this, $prop))) {
      $className = get_called_class();
      throw new Exception("The property `{$prop}` in `{$className}` does not exist");
    }
    $this->$prop = $value;
    return true;
  }
}

class b extends a {
    private $test = 0;

    public function getTest() {
        return $this->test;
    }
}

// Case A
$b = new b;
$b->test = 1;
echo $b->getTest();

// Case B
$b = new b;
$b->test2 = 2;

我的问题是,如果班级a实际上没有看到变量test并且无法设置其值,为什么我不会收到任何类型的错误,例外,警告甚至一点点通知?

这种情况恰好发生在我的实际项目中,很难找到,因为没有生成错误,代码逻辑上看起来正确。那么如何防止将来出现这种错误呢?

1 个答案:

答案 0 :(得分:0)

由于类b扩展了类a,它继承了类__set()中的a方法。这意味着当您尝试在b上设置属性时b执行__set代码。您可以通过回显属性存在之外的get_called_class()

来测试这一点