В классе 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
переменной и не сможет установить его значение, почему бы мне не получить какую-либо ошибку, исключение, предупреждение или даже небольшое уведомление?
Это ситуация, которая произошла со мной в реальном проекте, и ее было сложно найти из-за отсутствия генерируемой ошибки, а код логически выглядел корректно. Итак, как я могу предотвратить подобные ошибки в будущем?
Поскольку класс b
расширяет класс a
, он наследует метод __set()
из класса a
. Это означает, что при попытке установить свойство на b
это b
выполняется код __set
. Вы можете проверить это, повторив значение get_called_class()
вне свойства
1
? Классb
должен установить свою собственную частную собственность1
, а затем повторил1
, но вместо этого он перекликается0
.__set
вызывается только тогда, когда свойство не существует. Так как$test
есть, класс пытается установить значение без__set
но не может, так как он__set