- 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();
}
?>
実際の動作確認
- 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();
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()
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()
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()