Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2004/10/09

counter hits
since 1999/11/06


PHP5を試してみる - エラーレベル「E_STRICT」

memoサンプルは、EXPERIENCEで実際に確認できるようにしてますので、気になる方は見てみてください。

PHP4におけるクラス継承でメソッドをオーバーロードする場合、最後に定義した1つしか有効になりませんでした。このため、デザインパターンなどを使った場合など、メソッドシグネチャを厳密に継承させたい場合に制作者側がメソッドシグネチャを意識せざるを得ない状態でした。

しかし、PHP5からはエラーレベルにE_STRICTが加わり、チェックできるようになったようです。

使い方としては至って簡単で、php.iniのerror_reportingにE_STRICTレベルでもエラーを出力させるよう設定するだけです。当然、設定を反映させるために、Apacheの再起動は必要です。

●php.ini
            :
;error_reporting  =  E_ALL
error_reporting  =  E_ALL|E_STRICT
            :
  

例えば、ClassAを継承するClassBがあり、各メソッドをClassBでオーバーロードする場合のサンプルスクリプトと実行結果は、以下のような感じになります。

●e_strict/e_strict.php5

<?php
class ClassA
{
    function __construct() { echo "__construct() in ClassA<br>"; }
    function methodA($param) { echo "methodA in ClassA<br>"; }
    function methodB() { echo "methodB in ClassA<br>"; }
}
class ClassB extends ClassA
{
    function __construct() {
        parent::__construct();
        echo "__construct() in ClassB<br>";
    }
    function methodA() { echo "methodA in ClassB<br>"; }
    function methodB($param) { echo "methodB in ClassB<br>"; }
}
?>
<?php
    echo "コンストラクタを呼び出します。<br>";
    $class_b = new ClassB();
    echo "methodAを呼び出します。<br>";
    $class_b->methodA();
    echo "methodBを呼び出します。<br>";
    $class_b->methodB('1');
?>
<hr>
<?php
    show_source($_SERVER["SCRIPT_FILENAME"]);
?>

●実行結果(適宜改行しています)
Strict Standards: Declaration of ClassB::methodA() must be
                compatible with that of ClassA::methodA() in ...

Strict Standards: Declaration of ClassB::methodB() must be
                compatible with that of ClassA::methodB() in ...
コンストラクタを呼び出します。
__construct() in ClassA
__construct() in ClassB
methodAを呼び出します。
methodA in ClassB
methodBを呼び出します。
methodB in ClassB
  

実際にはnotice/warningレベルですが、開発時に「E_STRICT」を指定しておくとPHP4に比べればかなりチェックしやすくなると思います。

。。。やっぱ、Javaのように本当のオーバーロードは無いのね。。。(;_;)

また、非staticメソッドをstaticに呼び出した時のワーニングも表示されるようになったようです。この場合、「Strict Standards: Non-static method Class::method() should not be called statically」のようなワーニングが表示されます 。なお、エラーレベル「E_ALL」では表示されません

●e_strict/e_strict_static.php5

<?php
class ClassA
{
    function __construct() { echo "__construct() in ClassA<br>"; }
    function nonStaticMethod($param) { echo "nonStaticMethod<br>"; }
    static function staticMethod($param) { echo "staticMethod<br>"; }
}
?>
<?php
    $class_a = new ClassA();
    $class_a->nonStaticMethod('1');
    $class_a->staticMethod('2');

    ClassA::nonStaticMethod('3');
    ClassA::staticMethod('4');
?>
<hr>
<?php
    show_source($_SERVER["SCRIPT_FILENAME"]);
?>

●実行結果(適宜改行しています)
__construct() in ClassA
nonStaticMethod
staticMethod

Strict Standards: Non-static method ClassA::nonStaticMethod() should not be called
statically in /path/to/php5/e_strict/e_strict_static.php5 on line 14
nonStaticMethod
staticMethod
  

実際の動作は、doyouphpのページをご覧下さい。また、PHP4のクラスとJavaのクラスのページも参考までにどうぞ。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2004 by Hideyuki SHIMOOKA all rights reserved.