Совместимость PHP4 и PHP5 стат. метода

Screjet

Новичок
Совместимость PHP4 и PHP5 стат. метода

Вобщем перешел полностью на 5-й ПХП.

Но обнаружил одну небольшую несовместимость со статическими методами, вот пример:
PHP:
class A {

    var $a=0;
    function A(){
        echo isset($this) ? 'true' : 'false';
        echo "\n";
    }

    function B(){
        echo isset($this->a) ? 'true' : 'false';
        echo "\n";
    }
}

class B {
    function test(){
        A::A();
        A::B();
    }
}

$b = new B();
$b->test();

A::A();
A::B();
Если раньше (в альфе или бете 5-й) в пространстве класса была фатальная ошибка "нельзя вызывать метод статически, который не объявлен статическим",
то сейчес (по моемому) забыли чето сделать с глобальным пространством.
Или это, может, так задумано?
 

Frol

Новичок
zend.ze1_compatibility_mode должно помочь.
только все равно лучше будет переделать при переходе на PHP5.
 

tony2001

TeaM PHPClub
хм. а вызывать конструктор статически - это разве не странно?
 

Screjet

Новичок
tony2001, это только пример,
и вообщето это не конструктор, а статический метод, имя которого совпадает с именем класса :)
(шутка)

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

Везде, где идет обращение к переменным в $this без пространства класса, будет ошибка.

zend.ze1_compatibility_mode
Не помогает.
 

tony2001

TeaM PHPClub
>tony2001, это только пример,
>и вообщето это не конструктор, а статический метод, имя которого совпадает с >именем класса
>(шутка)
так ты ради шутки попробуй не-конструктор вызвать статически (это конструктор. old-style, но конструктор).
 

Screjet

Новичок
>так ты ради шутки попробуй не-конструктор вызвать статически (это конструктор. old-style, но конструктор).
Везде, где идет обращение к переменным в $this без пространства класса, будет ошибка.
В т.ч. и через isset(). В чем собственно и проблема.. А вообще есть еще кое что про isset(), но это к теме не относится.

Это про метод A::B();
"Конструктор" не причем.
 

tony2001

TeaM PHPClub
Screjet

A::A();
Fatal error: Non-static method A::A() cannot be called statically in .. on line ..
A::B();
Fatal error: Using $this when not in object context in .. on line ..
одно и то же?

а то, что к $this в его отсутствие обращаться нельзя, так это и так понятно (и документировано).
Because static methods are callable without an instance of the object created, the pseudo variable $this is not available inside the method declared as static.
 

Screjet

Новичок
tony2001,

Сорри за невнимательность (слона то и не заметил).
Действительно, в ПХП5 нельзя обращаться к конструктору как к статическому методу. (В ПХП4 = можно). Ну неважно.

Конкретно, где возникла ошибка:
PHP:
Horde::lib/MIME.php::MIME::encodeAddress (){
// вызов
$addr_arr = Pear::Mail::RFC822.php::parseAddressList {
  if (!isset($this->mailRFC822)) {
    //..
  }
}
//..
}
Конкретно ошибка в строке:
if (!isset($this->mailRFC822)) ..
И тут не обращение, а проверка на существование свойства.

Теоретически везде можно переписать на:
if ( !isset($this) || !isset($this->prop) ) ..
то все будет работать.

Вобщем ладно, свое дело, сказать о проблеме, сделал.
 
Сверху