Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Abstract, protected, почему работает?
kirik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Жадный квантификатор
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6158
Пользователь №: 4795
На форуме: 16 лет, 11 месяцев, 12 дней
Карма: 120




Привет всем!

Вопрос на засыпку - почему это работает (отдаёт 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();
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kirik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Жадный квантификатор
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6158
Пользователь №: 4795
На форуме: 16 лет, 11 месяцев, 12 дней
Карма: 120




Сам себе отвечу.

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.

Отлично.. ООП, говорили они.. Инкапсуляция! - кричали они...
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
don.bidon  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 54
Пользователь №: 46417
На форуме: 2 года, 25 дней
Карма:




бред, конечно, из конструктора, мол, методы класса доступны ( хз
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Michael  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6347
Пользователь №: 18498
На форуме: 15 лет, 7 месяцев, 24 дня
Карма: 269




Это ж всегда так было, вот в доках. Раздел "Видимость из других объектов"

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

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
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
miketomlin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 267
Пользователь №: 43211
На форуме: 8 лет, 7 месяцев, 21 день
Карма: 3




Цитата (Michael @ 3.01.2025 - 09:47)
Меня более удивляет что родитель видит внутряки потомков.

Вы же сами передаете экземпляру A экземпляр B и вызываете метод B.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Michael  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6347
Пользователь №: 18498
На форуме: 15 лет, 7 месяцев, 24 дня
Карма: 269




Цитата (miketomlin @ 3.01.2025 - 12:30)
вызываете метод B.

защищенный метод, о котором, по идее, A не должен знать


--------------------
There never was a struggle in the soul of a good man that was not hard
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
miketomlin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 267
Пользователь №: 43211
На форуме: 8 лет, 7 месяцев, 21 день
Карма: 3




Цитата (Michael @ 3.01.2025 - 15:58)
защищенный метод, о котором, по идее, A не должен знать

От наследников/родителей protected не защищает. Для этого есть private wink.gif
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kirik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Жадный квантификатор
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6158
Пользователь №: 4795
На форуме: 16 лет, 11 месяцев, 12 дней
Карма: 120




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

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


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

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


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

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

Private немного про другое, он не позволяет знать предкам про какие-то родительские методы/свойства.
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Цитата (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());// '_protect'



попробуйте вместо экз. класса А проделать эту работу ручным способом, т.е.

$ba = new B();
print $ba->_protect();// '_protect';


вы получите то же самое, т.е. php работает правильно, как видно и задумали арх. Экземпляр класса кот. родитель не видит ничего в своем потомке, он работает с переданным экз. класса В, из которого и возвращается результат через посредника, т .е. через экз. класса А
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса