Сегодня, дети, я расскажу еще одну страшную сказку. Сказку об области видимости в PHP.
Вот вам безобидный пример кода с ошибкой:
<?php
class a{
private $foo;
public function setFoo($foo){
$this->foo = $foo;
}
}
class b extends a{
public function getFoo(){
return $this->foo;
}
}
$c = new b();
$c->setFoo("Hello!");
echo $c->getFoo()."\n";
Даже распоследнее школие понимает, что здесь не так: getFoo() не может сработать, потому что foo надежно скрыто в недрах родительского класса. Тем не менее, PHP об этом даже NOTICE'ом не обмолвится! Впрочем, ошибку легко заметить и исправить ввиду того, что пример махонький. Когда кода побольше, сделать это порой не так легко — именно из-за того, что сам PHP об этом молчит как партизан.
Я напоролся на этот ляп, когда рефакторил немаленькую иерархию классов и вот как раз переделывал один класс с кучей if-ов в три класса с наследованием. И накололся именно о то, что все закрытые свойства и методы в начальном классе были приватными и, как водится, некоторые из них я забыл сделать protected. Потом долго удивлялся, что ж это все вдруг внезапно начало работать неправильно?
g++ о таких вещах хоть честно тебя обматерит, и на том спасибо.