PHP の abstract static function 廃止

  • PHP5.0, PHP5.1 では手違いで、こんな class が作れてました。
<?php
abstract class foo {
    abstract static function bar();
}
  • PHP5.2 で廃止扱いになり一応動きはしますが Strict で警告が出ます。
    • 具体的には error_reporting に E_STRICT(PHP5.2,5.3 では PHP_ALL に含まない)を指定した場合に警告が出力されます。
Strict Standards: Static function A::foo() should not be abstract in /home/yoya/abstract_static.php on line 3
  • PHP5.3 も PHP5.2 と同様です。
  • PHP5.4 も根本的には同様ですが、error_reporting の E_ALL に E_STRICT が含まれるようになったので、& ~E_STRICT 等として明示的に外さない限り警告が出ます。あと、一応動作はします。
  • PHP5.5 は未調査です。

マニュアルの説明

abstract static なクラス関数が削除されました。 
ちょっとした手違いで、PHP 5.0.x および 5.1.x では abstract static
な関数をクラス内で定義できてしまっていました。PHP 5.2.x では、 
これはインターフェイス内でのみ定義できるようになりました。
<?php
abstract class foo {
    abstract static function bar();
    /* Strict Standards:  Static function foo::bar()
       should not be abstract in filename on line n */
}
?>

実際の動作確認

  • abstract_static.php (テスト用ファイル)
<?php
abstract class A {
    abstract static function foo();
}
class B extends A {
    static function foo() { echo "B:foo()\n"; }
}

$b = new B();
$b->foo();
  • PHP5.2
yoya@sakura:~$ ~/php/5.2.0/bin/php -d "error_reporting=E_ALL" abstract_static.php
X-Powered-By: PHP/5.2.0
Content-type: text/html

B:foo()
yoya@sakura:~$ ~/php/5.2.0/bin/php -d "error_reporting=E_ALL|E_STRICT" abstract_static.php
X-Powered-By: PHP/5.2.0
Content-type: text/html

<br />
<b>Strict Standards</b>:  Static function A::foo() should not be abstract in <b>/home/yoya/abstract_static.php</b> on line <b>3</b><br />
B:foo()
  • PHP5.3
yoya@sakura:~$ ~/php/5.3.0/bin/php -d "error_reporting=E_ALL" abstract_static.php
B:foo()
yoya@sakura:~$ ~/php/5.3.0/bin/php -d "error_reporting=E_ALL|E_STRICT" abstract_static.php

Strict Standards: Static function A::foo() should not be abstract in /home/yoya/abstract_static.php on line 3
B:foo()
  • PHP5.4
yoya@sakura:~$ ~/php/5.4.0/bin/php -d "error_reporting=E_ALL" abstract_static.php

Strict Standards: Static function A::foo() should not be abstract in /home/yoya/abstract_static.php on line 3
B:foo()
yoya@sakura:~$ ~/php/5.4.0/bin/php -d "error_reporting=E_ALL&~E_STRICT" abstract_static.php
B:foo()