Почему мой установщик не предупреждает, что свойство не может быть установлено?

0

В классе 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 переменной и не сможет установить его значение, почему бы мне не получить какую-либо ошибку, исключение, предупреждение или даже небольшое уведомление?

Это ситуация, которая произошла со мной в реальном проекте, и ее было сложно найти из-за отсутствия генерируемой ошибки, а код логически выглядел корректно. Итак, как я могу предотвратить подобные ошибки в будущем?

Теги:
extending-classes

1 ответ

0

Поскольку класс b расширяет класс a, он наследует метод __set() из класса a. Это означает, что при попытке установить свойство на b это b выполняется код __set. Вы можете проверить это, повторив значение get_called_class() вне свойства

  • 0
    Тогда почему не дело А эхо 1 ? Класс b должен установить свою собственную частную собственность 1 , а затем повторил 1 , но вместо этого он перекликается 0 .
  • 0
    __set вызывается только тогда, когда свойство не существует. Так как $test есть, класс пытается установить значение без __set но не может, так как он __set
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню