[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Abstract, protected, почему работает?
kirik
Привет всем!

Вопрос на засыпку - почему это работает (отдаёт 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();
kirik
Сам себе отвечу.

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
бред, конечно, из конструктора, мол, методы класса доступны ( хз
Michael
Это ж всегда так было, вот в доках. Раздел "Видимость из других объектов"

Меня более удивляет что родитель видит внутряки потомков.

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());// '_protect'




_____________
There never was a struggle in the soul of a good man that was not hard
miketomlin
Цитата (Michael @ 3.01.2025 - 09:47)
Меня более удивляет что родитель видит внутряки потомков.

Вы же сами передаете экземпляру A экземпляр B и вызываете метод B.
Michael
Цитата (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
Цитата (Michael @ 3.01.2025 - 15:58)
защищенный метод, о котором, по идее, A не должен знать

От наследников/родителей protected не защищает. Для этого есть private wink.gif
kirik
Цитата (Michael @ 3.01.2025 - 09:47)
Это ж всегда так было, вот в доках. Раздел "Видимость из других объектов"

В доке как раз про "объекты одного и того же типа" и это честно, т.к. о реализации мы знаем из контекста такого же класса в котором работаем.


Цитата (Michael @ 3.01.2025 - 09:47)
Это ж всегда так было, вот в доках. Раздел Меня более удивляет что родитель видит внутряки потомков.

Ох.. вот это тоже бага. Ну не может родитель знать о реализации своих предков. Предки про родителя - ещё куда ни шло.


Цитата (miketomlin @ 3.01.2025 - 17:17)
От наследников/родителей protected не защищает. Для этого есть private

Как раз protected должен защищать от неконтекстных вызовов, например:
- дочерние классы знают про protected методы родительских, т.к. унаследованы
- родительский класс не должен ничего знать о дочерних реализациях, ибо это нарушает идею наследования

Private немного про другое, он не позволяет знать предкам про какие-то родительские методы/свойства.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.