Возникла следующая ситуация: Есть какой-то класс (паттерн одиночка), у него есть private конструктор Код (Text): class foo { private function __construct() { ... } } Естественно конструктор должен выполняться только один раз. Но если я потом от этого класса наследую другой класс (который не использует паттерн одиночка), у которого нет конструктора Код (Text): class foo2 extends foo { ... } То при создании объекта foo2 будет вызываться конструктор базового класса. Соотвественно если у foo2 есть свой конструктор, то нет. А нормально, что при отсутствии конструктора у дочернего класса то, что вызывается конструктор родительского класса, несмотря на то, что он private? Нигде не нашел на этот вопрос ответ. А мне собственно интересно) Заранее спасибо!
надо читать. так в голову ничего не приходит. наверняка гденить обсосано. по логике, должен быть эррор.
Если сделать так, то error естественно будет Код (Text): class foo2 extends foo { public function __construct() { parent::__construct(); } } Но вот когда автоматом вызывается родительский конструктор, он почему-то проскакивает... Добавлено спустя 4 минуты 8 секунд: Разобрался) Забыл упомянуть, что объект класса foo2 создавался в одном из методов класса foo, поэтому для него private не имело значений)
т.е. если нечто наследуется внутри родителя, то приватные и протектед методы ему доступны в самом себе? =)
Ну получается видимо что так) Код (Text): class foo { private function __construct() { ... } public function GetFoo2() { return new foo2; } } Так как мы создаем объект внутри нашего класса, то все равно что обращаемся к своему же методу, хотя мне такое поведение не нравится)) Добавлено спустя 1 минуту 7 секунд: Обошел это дополнительной проверкой внутри конструктора foo на наличие экземпляра foo(у нас ведь одиночка).
я всегда считал, что если ты написал private, то независимо от места наследования, ничего не унаследуется. а с другими приватными методами тоже прокатывает?
Если так, то тоже работает Код (Text): class foo { private function __construct() { ... } public function GetFoo2() { $boo = new foo2; $boo->PrintFoo(); } private function PrintFoo() { echo 'хаха я все равно работаю'; } } Добавлено спустя 1 минуту 14 секунд: Во всяком случае так работает в php 5.3.6 под Mac os x
Да я тоже удивился) Я всегда тоже считал,что если private то дочерний объект ну никак не может доступ получить.
а что будет если из этого приват метода обратиться к переменной класса? интересно, какое значение она будет содержать. Вдруг родительское? ладушки, я спать.
Вот: Код (Text): class foo { private $boo; private function __construct() { $this->boo = 'parent'; } public static function GetInstance() { ... } public function GetFoo2() { $temp = new foo2; $temp->PrintFoo(); return $temp; } private function PrintFoo() { echo $this->boo; } } class foo2 extends foo { public function __construct() { $this->boo = 'child'; } } $test = foo::GetInstance(); $test = $test->GetFoo2(); Выведет "parent"
У меня сейчас нет возможности проверить это на самой последней сброке php, а надо бы, и если там так, есть желание пойти баг запостить, ну или чтоб кто-нибудь пришел и сказал что так задумано)
ололо)) я бы никогда не подумал о такой фишке)) Хотя возможно просто невнимательно читал документацию. И дело совсем не в синглтоне, проблема воспроизводится с обычными объектами. Код (Text): <?php class ParentClass { private function somePrivateParentFunction() { echo "It's private parent function"; } public function doSomethingWithChild() { $child = new ChildClass(); $child->somePrivateParentFunction(); } } class ChildClass extends ParentClass { } $parent = new ParentClass(); $parent->doSomethingWithChild(); Вывод: It's private parent function
Нашел обсуждение похожей проблемы - http://rmcreative.ru/blog/post/vyzov-private-metoda-iz-static-metoda Как и предполагалось - надо внимательнее читать документацию MiksIr Спасибо, уже тоже нашел.
скорее всего некий механизм внутренний был сделан для скорости так, что методы просвечивают. на умышленное не похоже.