2013-08-21 3 views
1
<?php 
class A { 
    var $name= 'A'; 
    function main($objC){ 
     var_dump($this);B::request('init', $objC); 
    } 

} 
class B { 
    var $name= 'B'; 
    function request($func, $objC){ 
     if (method_exists($objC, $func)){ 
      var_dump($this);$objC->$func($this); 
     } 
    } 

} 
class C { 
    var $name= 'C'; 
    function init($pobj){  
     var_dump($this); 
    } 
} 
$objA = new A; 
$objB = new B; 
$objC = new C; 
$objA->main($objC); 

Выход:

object(A)[1] 
    public 'name' => string 'A' (length=1) 

object(A)[1] 
    public 'name' => string 'A' (length=1) 

object(C)[3] 
    public 'name' => string 'C' (length=1) 

Я думал $this в Class B всегда означает объект этого Class B. Но, похоже, нет, может кто-нибудь объяснить: почему var_dump($this); в class B, выходы ниже результата не object(B)?

object(A)[1] 
     public 'name' => string 'A' (length=1) 
+0

'B :: request' - это' статический' вызов, а не вызов какого-либо экземпляра 'B', поэтому var_dump ($ this) из' B' не имеет никакого отношения к 'B' $ $ –

+0

@ MarkBaker oops удалил мой комментарий о 'static', подумал, почему был задан' $ this'. – meze

ответ

1

Если запустить это с включенным полным протоколирование ошибок, это объясняет, почему:

Строгие стандарты: Non-статический метод B :: запрос() не должен вызываться статически, полагая $ это от несовместимого контекста в /php/tests/o2.php на линии 6

так в основном, использование $ это в статически называемый метод не имеет смысла, поэтому PHP на самом деле пытается применить контекст .... и похоже, что он применяет $ this от вызывающего метода

+0

«$ это в статически называемом методе бессмысленно» не всегда. Ошибка связана с несовместимым контекстом. Если контекст один и тот же, ошибка не будет вызвана afaik. – meze

+0

Истина: если контекст один и тот же (т. Е. У меня есть метод 'запрос' в классе А, который ссылается на $ this, и я называю его статическим из другого метода в A), то я не получаю такого предупреждения, потому что контекст isn ' t несовместимо –

+0

Я думаю, что моя точка по-прежнему действительна: поскольку контекст несовместим (т. е. в иерархии вызовов нет ссылки на экземпляр B), то он возвращается к предыдущему (несовместимому) контексту. В любом случае, я бы не рекомендовал его как хорошую практику кодирования. –

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