0

在课堂a上我有一个setter定义。在b扩展类的 classa中,有一个private变量,因此该类a将无法看到。此代码中的setterin 类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并且无法设置它的值,为什么我不会收到任何类型的错误、异常、警告甚至是一点点通知?

这是我在一个真实项目中刚刚发生的情况,由于没有生成错误并且代码在逻辑上看起来正确,因此很难找到。那么如何防止以后再犯这种错误呢?

4

1 回答 1

0

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

于 2015-02-02T08:48:22.840 回答