2015-07-01 8 views
2

Имея код

class A { 
    private function foo() {} 
    public function test() { 
     $this->foo(); 
     static::foo(); 
    } 
} 

class B extends A { 
    private function foo() {} 
} 

И, взяв какую документацию говорит: «... $ this-> будет пытаться вызывать закрытые методы из той же области ...»

  1. Что означает «одинаковый охват»?
  2. Какова область действия «$ this» в примере кода?
+0

http://stackoverflow.com/questions/20908078/private-prefix-for-methods-not-working-with-polymorphism-in-php – user2864740

+0

Текущий класс: self: not $ this – ThomasP1988

+0

@ Muhammet - so что такое «текущий класс/объект»? A или B? – Mulligan1981

ответ

1

Формулировка «из того же объема» означает «из же класса, в котором этот метод определен».

В этом случае test определен в классе A. Таким образом, $this->foo() собирается позвонить A foo - не имеет значения, является ли $this является A или B, поскольку private методов: неpolymorphic.

Контрастировать это до protected методов, которые являются полиморфными, поэтому изменение модификатора доступа изменяет поведение; и удаляет пункт «той же области действия».

Относительно того, почему это так оно и есть, рассмотреть роль модификаторов:

Члены объявляются защищенному могут быть доступны только внутри самого класса и наследственными и родительских классов. Пользователей, объявленных как private, может быть доступен только [тот же] класс, который определяет член.

Это означает, что $this->foo() (от испытания А в) не может возможно назвать Foo B, либо он будет нарушать это ограничение.Другие языки ООП работают аналогично по той же причине: только полиморфизм работает, вызывающему пользователю разрешен доступ к этому методу.

См. Why are private methods not working with polymorphism?, который действительно является дубликатом, хотя вопрос написан с точки зрения опытного поведения.


Это «одинаковый объем» формулировка относится к тому, как будет решен метод, и делает не относятся к $this напрямую. Лексическим объемом $this, специальной переменной, будет текущий метод экземпляра; и значение $this - это значение экземпляра, на который был вызван метод.

+0

Итак, когда интерпретатор попадает в «$ this-> foo», он ищет модификатор доступа метода foo. Если это частное, это означает «отсутствие позднего связывания» и «отсутствие полиморфизма», поскольку частные методы нельзя переопределить. Если модификатор является общедоступным или защищенным, это означает «позднее связывание» и полиморфизм, поэтому он смотрит на то, что это означает и что он указывает на объект $ b класса B. Правильно ли я? – Mulligan1981

+0

@ Mulligan1981 Это довольно хорошее резюме, да. – user2864740

+0

Хорошо, спасибо :-) – Mulligan1981

0

$ это действительное значение в классе самого класса, поэтому внутри класса B, вызывающего $ this-> foo, вызывается функция foo() класса B, поскольку она находится в области B, если вы хотите вызов foo() класса A внутри класса B, вы ссылаетесь на него с использованием родительского ключевого слова:

parent :: foo(), в этом случае foo не находится в локальной области B, он находится в родительской области ,

+0

Итак, в моем примере, когда я использую $ this-> foo() в методе «test» класса A $, это переопределяет область A или B? – Mulligan1981

+0

Он относится к классу A. – KAD

+0

Но почему «get_class ($ this)» запускается в «тестовом» методе класса A, ретарнирует B не A? – Mulligan1981

0

here хорошо читать на $this

псевдо-переменная $ это доступно, когда метод вызывается из в пределах контекста объекта. $ это ссылка на вызывающий объект (обычно объект, к которому принадлежит метод, но возможно еще один объект , если метод вызван статически из контекста вторичного объекта ).

PHP's visibility также может дать вам представление о сфере действия на уровне класса и объекта.

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