2016-03-01 2 views
-1

Я учусь Классы и объекты PHP, но эти коды меня смущает:Почему вывод программы php?

<?php 
class A 
{ 
    public function test() 
    { 
     //output will be A load(), why? 
     self::load(); 
     //output will be B load(), why? 
     $this->load(); 
    } 
    public function load() 
    { 
     echo "A load()"; 
    } 
} 

class B extends A 
{ 
    public function test() 
    { 
     parent::test(); 
    } 
    public function load() 
    { 
     echo "B load()"; 
    } 
} 
$c = new B(); 
$c->test(); 

В этих ситуациях, почему self::load() и $this->load() получить другой вывод?

Опишите подробно.

+0

Возможный дубликат [Когда использовать себя более чем $ это?] (HTTP://stackoverflow.com/questions/151969/when-to-use-self-over-this) – mitkosoft

+0

потому что 'self :: load()' ссылается на метод 'load()' класса __, где метод называется__ в наследовании дерево; тогда как '$ this-> load()' ссылается на метод загрузки __instance__, а по наследованию метод 'B'' load() 'переопределяет метод' A' 'load()' для экземпляра –

ответ

5

Это потому, что self используйте класс, который он принадлежит, так как он был определен. Все это документально оформлено здесь: http://php.net/manual/en/language.oop5.late-static-bindings.php

Существует 44-разрядный номер self и static. Обратите внимание на свой код, как правило, тест метода должен быть определен как статический для вызова его с помощью self::test();.

0

так что давайте начнем.

Self выберите текущий класс.

this выбран текущий объект.

поэтому при использовании self::load(); он загрузит функцию класса А

в другой руке, когда вы используете $this->load(); это значит class B->load

Смежные вопросы