Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: наследование в РНР
 
 автор: Spartak   (16.11.2009 в 22:34)   письмо автору
 
 

Приветствую всех! Помогите пожалуйста разобраться в тонкостях синтаксиса РНР...
Вот пример из официальной документации по РНР:
--------------------------------------------------

<?php
class Bar 
{
    public function 
test() {
        
$this->testPrivate();
        
$this->testPublic();
    }

    public function 
testPublic() {
        echo 
"Bar::testPublic\n";
    }
    
    private function 
testPrivate() {
        echo 
"Bar::testPrivate\n";
    }
}

class 
Foo extends Bar 
{
    public function 
testPublic() {
        echo 
"Foo::testPublic\n";
    }
    
    private function 
testPrivate() {
        echo 
"Foo::testPrivate\n";
    }
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic
?>

----------------------------------------------------------------
Но я не могу понять почему вывод такой а не другой - (Foo::testPrivate Foo::testPublic) !!!?
Как это может быть что ссылка $this в одном случае указывает на родительскую функцию а в другом на собственную???
Буду очень благодарен если откроете мне эту страшную тайну, а то ломаю голову и никак этого не пойму!:)

  Ответить  
 
 автор: Stop   (16.11.2009 в 22:42)   письмо автору
 
   для: Spartak   (16.11.2009 в 22:34)
 

$this->testPrivate();
$this->testPublic();

потмоу что насследование двух переменных а не одной

  Ответить  
 
 автор: Spartak   (17.11.2009 в 20:14)   письмо автору
 
   для: Stop   (16.11.2009 в 22:42)
 

каких 2-х переменных??? унаследовались test(), testPublic(). Когда мы вызываем унаследованную test(), то $this это ссылка на объект класса Foo. Тогда почему вызывается версия Bar::testPrivate???

  Ответить  
 
 автор: The Electronic Cat   (18.11.2009 в 15:58)   письмо автору
 
   для: Spartak   (17.11.2009 в 20:14)
 

Если вы перенесете метод test() в класс Foo, то увидите
Foo::testPrivate
Foo::testPublic

Если метод определен, как private, то обратиться к нему можно только из этого же класса. Поэтому метод Foo::testPrivate() недоступен для метода Bar::test()

  Ответить  
 
 автор: Spartak   (18.11.2009 в 20:11)   письмо автору
 
   для: The Electronic Cat   (18.11.2009 в 15:58)
 

Но почему тогда вызывается Foo::testPublic а не Bar::testPublic? test() ведь определен в классе Bar? Ведь и Bar::testPublic и Foo::testPublic доступны из Bar::test()!

  Ответить  
 
 автор: The Electronic Cat   (19.11.2009 в 16:39)   письмо автору
 
   для: Spartak   (18.11.2009 в 20:11)
 

Вы же создали объект класса Foo. Если доступны оба метода, то PHP активирует метод того класса, объект которого инициализирован (т.е. дочернего в этой ситуации).
Метода Foo::testPrivate() из Bar::test() не видно, как я писал, поэтому получаете Bar::tetsPrivate(). Публичный метод Foo::testPublic() - виден.

Вас путает контекст вызова методов. Вызовите testPublic() и testPrivate() из метода класса Foo - получите Foo::testPublic и Foo::testPrivate. Вызовите вне класса - вообще ошибку доступа получите.

  Ответить  
 
 автор: The Electronic Cat   (17.11.2009 в 14:01)   письмо автору
 
   для: Spartak   (16.11.2009 в 22:34)
 

Методы, определенные как private, не наследуются. Если нужно сделать переменную/метод видимыми для производных классов, используйте спецификатор доступа "protected".

  Ответить  
 
 автор: emme_lated   (19.11.2009 в 16:51)   письмо автору
 
   для: The Electronic Cat   (17.11.2009 в 14:01)
 

как создавали язык и синтаксис,такие и ломания головы и вопросы.Языки несовершенные,компам от силы 30 лет...Подождите,лет через 40 языки будут болле читабельными

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования