баг или фича?

Alek Veritov

Новичок
баг или фича?

PHP:
abstract class P { 	
  protected $t = array(); 
}   

class A extends P { 
  function at(){ 		
    $this->t[] = 'at'; 	
  } 
} 

class B extends P { 
  function __construct(){ 		
    A::at(); 		
    $this->t[] = 'bt'; 		 		
    var_dump($this->t); 	
  } 
}  

new B();
результат:
PHP:
array(2) {  	
  [0]=>  string(2) "at"  	
  [1]=>  string(2) "bt"  
}
вопрос собственно в сабже
 

Splurov

Новичок
Похоже на баг, но у тебя ошибка в коде:
Strict Standards: Non-static method A::at() should not be called statically, assuming $this from incompatible context in H:\htdocs\localhost\tmp\test-a.php on line 14
array(2) { [0]=> string(2) "at" [1]=> string(2) "bt" }
 

tz-lom

Продвинутый новичок
У меня же наоборот не ругается ни на что
вообще довольно интересное поведение,но в документации никаких отсылок на него пока не нашёл
 

Alek Veritov

Новичок
Автор оригинала: Splurov
Похоже на баг, но у тебя ошибка в коде:
это не ошибка, потому что метод вызывается не из статического контекста.
это предупреждение, причем какое-то специфическое ... под виндой сидишь?

-~{}~ 28.06.10 18:52:

Автор оригинала: tz-lom
У меня же наоборот не ругается ни на что
вообще довольно интересное поведение,но в документации никаких отсылок на него пока не нашёл
в документации написано: "Members declared protected can be accessed only within the class itself and by inherited and parent classes",
но А не inherited и не parent В, поэтому видеть $t не должен, тем более $this->t
 

zerkms

TDD infected
Команда форума
[...]

ps: у спларова варнинг вполне ожидаемый, включи вывод ошибок

но так или иначе - поведение ошибочное, баг
 

tz-lom

Продвинутый новичок
трабла в том что вывод ошибок включен ( проверил )
правда у меня 5.3.2
 

Adelf

Administrator
Команда форума
нафиг-нафиг такие фичи. Баг.
Хотя.. сообщение нарушения Strict standards есть.. ну а то, что php - вольный язык, мы уже вроде привыкли.
 

A1x

Новичок
думаю что эту багофичу оставили для совместимости с пхп4, но делать так не надо ни в коем случае, потому и варнинг появляется

багофича в том что если метод вызывается статически - A::at() то внутрь метода передается $this из текущей области видимости

так как A::at() вызывается в конструкторе то $this там естественно текущий объект
 

Alek Veritov

Новичок
php 5.3.2 ошибок никаких не выводит.
про статическую передачу $this не знал, почему то всегда думал, что в статическом методе $this вообще нет.
 

Вурдалак

Продвинутый новичок
Автор оригинала: Alek Veritov
почему то всегда думал, что в статическом методе $this вообще нет.
— так и есть. Этот код вообще работать не должен, т.к. формально для него не определено поведение. Так что винить-то особо некого...
 

A1x

Новичок
например
PHP:
class A extends P { 
  public satic function at() {         
    $this->t[] = 'at';     
  } 
}
выдаст фатальную ошибку при компиляции, в то же время этот же код без слова satic будет выполнятся

это оставили для обратной совместимости (такой код например встречается в очень старых версиях PEAR)
 

tz-lom

Продвинутый новичок
static <- это пишется так
но да,всё поломается и будет ругань во время исполнения
 
Сверху