[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Странный аспект наследования в PHP
Страницы: 1, 2, 3, 4
dron4ik
Guest
Читаем внимательно
Цитата
protected — метод доступ для самого класса и всех его наследников, но не доступен из-вне.

ну так и не нужно из вне его трогать... а с дочернего, почему бы и нет?

_____________
Ex3m.com.ua — Активный образ жизни
Guest
dron4ik
A1 не является ни дочерним ни родительским классом по отношению к A2
<?php
class
Base
{
protected function testProtect()
{
return print ('Base');
}
}


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


class Bar extends Base
{
public function test()
{
$b = new Foo();
$b->testProtect();
}
}


$qwe = new Bar();
$qwe->test(); //Foo
Игорь_Vasinsky
Цитата
class Foo extends Base
{
    protected function testProtect()
    {
        return print ('Foo');
    }
}


ну ты же сам переназначил testProtect()

смысл наследования - не только в передачи методов, но и в возможности манипулировать ими

_____________
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
Игорь_Vasinsky
Цитата
A1 не является ни дочерним ни родительским классом по отношению к A2

да, но он наследник класса A - владелец защищённого метода -вызов которого тебя так удивил

_____________
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
Игорь_Vasinsky
..и всё.... даже скучно стало

_____________
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
AlmazDelDiablo
Цитата (Игорь_Vasinsky @ 23.05.2013 - 16:35)
..и всё.... даже скучно стало

offtop
Свернутый текст
Мне кажется, они уверовали в нашу непонятливость и глупость, сказали начальнику, что PHP говно и продолжили кодить на C#.


_____________
Блог | VK | GitHub | Twitch
Guest
Цитата (Игорь_Vasinsky @ 23.05.2013 - 15:30)
да, но он наследник класса A - владелец защищённого метода -вызов которого тебя так удивил

В коде не происходит вызова метода класса A
dron4ik
Guest
происходит... через дочерний класс А1

_____________
Ex3m.com.ua — Активный образ жизни
Guest
Ошибка, в коде автора происходит вызов A, в моём методы класса Base не вызываются
Игорь_Vasinsky
Гость - ты кто?

мы какой код обсуждаем?

я написал про твой, потом ответил на вопрос по первому коду

_____________
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
Игорь_Vasinsky
Цитата

Цитата (Игорь_Vasinsky @ 23.05.2013 - 15:30)
да, но он наследник класса A - владелец защищённого метода -вызов которого тебя так удивил

В коде не происходит вызова метода класса A


$a1->testA() - а это кто?

_____________
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 - 15:30)
да, но он наследник класса A - владелец защищённого метода -вызов которого тебя так удивил

Т.е. если A1 и A2 наследуются от общего A, то они должны иметь права вызывать любые protected методы из A1, A2 и A?
keeper_evil
Цитата (Guest @ 23.05.2013 - 15:21)
dron4ik
A1 не является ни дочерним ни родительским классом по отношению к A2
<?php
class
Base
{
    protected function testProtect()
    {
        return print ('Base');
    }
}


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


class Bar extends Base
{
    public function test()
    {
        $b = new Foo();
        $b->testProtect();
    }
}


$qwe = new Bar();
$qwe->test(); //Foo

Человек меня понимает.
Можно еще это переписать вот так:
<?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
?>

Что тут не так? Да то, что мы переопределили защищенным методом приватную переменную $_content экземпляра класса Foo вне тела этого класса в теле класса Bar, который не является потомком класса Foo.
Быстрый ответ:

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