Привет всем!
Вопрос на засыпку - почему это работает (отдаёт
protected B)?)
https://onlinephp.io/c/6426c<?php
abstract class A
{
abstract protected function _protected();
}
class B extends A
{
protected function _protected()
{
echo 'protected B';
}
}
class C extends A
{
function test()
{
(new B())->_protected();
}
protected function _protected()
{
echo 'protected C';
}
}
(new C())->test();
Сам себе отвечу.
https://github.com/php/php-src/pull/2388> I'm afraid that this bug has existed so long that it turned into a feature. I'm pretty apprehensive about making such a major change to visibility handling.
Отлично.. ООП, говорили они.. Инкапсуляция! - кричали они...
don.bidon
3.01.2025 - 08:24
бред, конечно, из конструктора, мол, методы класса доступны ( хз
Michael
3.01.2025 - 09:47
Это ж всегда так было,
вот в доках. Раздел "Видимость из других объектов"
Меня более удивляет что родитель видит внутряки потомков.
class A
{
public function test(B $b)
{
return $b->_protect();
}
}
class B extends A
{
protected function _protect(){
return '_protect';
}
}
$a = new A();
print $a->test(new B());
_____________
There never was a struggle in the soul of a good man that was not hard
miketomlin
3.01.2025 - 14:30
Цитата (Michael @ 3.01.2025 - 09:47) |
Меня более удивляет что родитель видит внутряки потомков. |
Вы же сами передаете экземпляру A экземпляр B и вызываете метод B.
Michael
3.01.2025 - 15:58
Цитата (miketomlin @ 3.01.2025 - 12:30) |
вызываете метод B. |
защищенный метод, о котором, по идее, A не должен знать
_____________
There never was a struggle in the soul of a good man that was not hard
miketomlin
3.01.2025 - 17:17
Цитата (Michael @ 3.01.2025 - 15:58) |
защищенный метод, о котором, по идее, A не должен знать |
От наследников/родителей protected не защищает. Для этого есть private
Цитата (Michael @ 3.01.2025 - 09:47) |
Это ж всегда так было, вот в доках. Раздел "Видимость из других объектов"
|
В доке как раз про "объекты одного и того же типа" и это честно, т.к. о реализации мы знаем из контекста такого же класса в котором работаем.
Цитата (Michael @ 3.01.2025 - 09:47) |
Это ж всегда так было, вот в доках. Раздел Меня более удивляет что родитель видит внутряки потомков.
|
Ох.. вот это тоже бага. Ну не может родитель знать о реализации своих предков. Предки про родителя - ещё куда ни шло.
Цитата (miketomlin @ 3.01.2025 - 17:17) |
От наследников/родителей protected не защищает. Для этого есть private |
Как раз protected должен защищать от неконтекстных вызовов, например:
- дочерние классы знают про protected методы родительских, т.к. унаследованы
- родительский класс не должен ничего знать о дочерних реализациях, ибо это нарушает идею наследования
Private немного про другое, он не позволяет знать предкам про какие-то родительские методы/свойства.