[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Странный аспект наследования в PHP
Страницы: 1, 2, 3, 4
glock18
Цитата (AlmazDelDiablo @ 23.05.2013 - 10:52)
protected — метод доступ для самого класса и всех его наследников, но не доступен из-вне.
private — метод доступен только для самого класса.

Это не у PHP проблемы, а у вас и ваших коллег пробелы в знаниях и умении гуглить. Извините.

Это у вас проблемы с умением читать/понимать. Извините.
Guest
Цитата (Игорь_Vasinsky @ 23.05.2013 - 15:53)
А1 и А2 - наследники А, с какого перепуга они получать доступ к защищённым методам друг друга

Про это и тема. С какого перепуга A2 может вызвать метод A1
<?php
class
A
{
protected function testProtect(){}
}


class A1 extends A
{
protected function testProtect()
{
return print ('Foo');
}
}


class A2 extends A
{
public function test()
{
$b = new A1();
$b->testProtect();
}
}


$qwe = new A2();
$qwe->test(); //Foo
Игорь_Vasinsky
Цитата
Про это и тема. С какого перепуга A2 может вызвать метод A1

это код просто размещён в методе класса A2

а на сам деле ты этот метод дёргаешь из A1 - который его наследует у А

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Guest
Цитата (Игорь_Vasinsky @ 23.05.2013 - 16:03)
это код просто размещён в методе класса A2

а на сам деле ты этот метод дёргаешь из A1 - который его наследует у А

Если A2 не наследовать от A, то просто размещенный код перестает работать.
glock18
Цитата
ещё раз.

защищённый метод вызван у родителя.


$a1 = new A1(); - extends A
$a1->testA(); - унаследованный родительский метод в класса A1

$a1 - это экземпляр класса A1 - он может видеть protected методы у родителя


Тебя сбило то что ты в левом классе создал экземпляр второго класса и из него выдернул метод первого класса.

ты хоть в пятом классе работай - ты работаешь с экземпляром 2го класса


это конкретный такой бред, Игорь. Все кто в один голос указывает на некомпетентность ТСа - прошу идти и латать дыры в вашем понимании ООП, оно у вас страдает.

Цитата
это код просто размещён в методе класса A2

а на сам деле ты этот метод дёргаешь из A1 - который его наследует у А

это тоже круто. Как вы тогда представляете обращение к методам класса извне? Так что ли
Снаружи::test()
:lol: :lol:

TC: поведение, де факто, неверное, и подмечено это правильно. Сталкиваться с ним не приходилось мне лично, реализация ООП в пыхе вообще говоря грешит такими вещами.

Проблема не такая уж страшная, тем не менее, на мой взгляд, вполне можно с ней жить :)
AlmazDelDiablo
Мне кажется, нас активно троллят. Или высасывают из пальца тему для разговора.
Ребята нашли некое поведение, которого нет в C#, и вместо того, чтобы принять это как должное и использовать (или не использовать), ушли в глубокое отрицание данности. Ну вот так вот у PHP — он берет и вызывает protected метод через наследника даже из левого класса. Вот так и есть и всё тут. От того, что мы сейчас с вами нафлудим тут десяток-другой страниц, что-то изменится? Клссы в PHP вдруг обретут новые способности и поведение? Ей Богу, ни о чем разговор.

PS: Кстати, проверил только что, — в Java точно так же себя ведут protected методы/свойства.

_____________
Блог | VK | GitHub | Twitch
keeper_evil
Цитата (Guest @ 23.05.2013 - 16:14)
Если A2 не наследовать от A, то просто размещенный код перестает работать.

+1
Но по идее даже если и есть наследование от А у класса А2, все равно не должно работать, а почему-то работает.
и еще раз:
<?php
class
Base
{
private $_content;

public function getContent()
{
return $this->_content;
}

protected function setContent($content)
{
$this->_content = $content;
}
}


class Foo extends Base
{
public function setFoo()
{
$this->setContent('Foo'); // я ни чего не имею против этого.
}
}


class Bar extends Base
{
public function setBar(Foo $foo)
{
$this->setContent('Bar'); // и против этого тоже ни чего не имею.
$foo->setContent('Bar'); // но вот это на мой взгляд дикость какая то))
}
}


$foo = new Foo();
$foo->setFoo();
$bar = new Bar();
$bar->setBar($foo);
echo $foo->getContent(); //Bar
echo $bar->getContent(); //Bar
?>
Быстрый ответ:

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