В классе a
у меня есть setter
определены. В классе b
, который расширяет класс a
, Eсть private
переменная, что класс a
поэтому не сможет видеть. setter
в классе a
в этом коде никогда не будет установлена переменная test
к значению, отличному от исходного, потому что он не может достичь его. Если вы запустите этот код, для случая А он выведет 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
и не смогу установить его значение, почему я не получаю никаких ошибок, исключений, предупреждений или даже крошечных уведомлений?
Это ситуация, которая только что случилась со мной в реальном проекте, и ее было трудно найти из-за отсутствия генерируемой ошибки и правильного кода. Так как же предотвратить подобные ошибки в будущем?
С классом b
расширяет класс a
наследует __set()
метод из класса a
, Это означает, что когда вы пытаетесь установить свойство на b
его b
выполнение __set
код. Вы можете проверить это, повторив get_called_class()
значение за пределами собственности существует
Других решений пока нет …