Help us understand the problem. What is going on with this article?

PHP5 Strict Standards:を非表示にする方法

More than 5 years have passed since last update.

PHP5でStrict Standardsのワーニングが出る場合

状況

PHP5.4以降はStrict Standardsのワーニングが表示される

方法
  • PHP.iniで解消する方法
php.ini
- error_reporting = E_ALL | E_STRICT
+ error_reporting = E_ALL & ~E_STRICT
  • PHPソースに記述する方法
sample.php
ini_set('error_reporting', E_ALL | ~E_STRICT);

参照:PHPマニュアル error_reporting
参照:PHP Document#error_reporting

Warningの理由

PHP5でクラスの継承を行った場合、継承元の引数の数や型が異なる場合に、ワーニングが表示されるようになりました。

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"]);
?>

引用元:Link

E_STRICTでのワーニング

( ! ) Strict standards: Declaration of ClassB::methodA() should be compatible with ClassA::methodA($param) in (省略)\e_strict.php on line 16

( ! ) Strict standards: Declaration of ClassB::methodB() should be compatible with ClassA::methodB() in (省略)\e_strict.php on line 16
コンストラクタを呼び出します。
__construct() in ClassA
__construct() in ClassB
methodAを呼び出します。
methodA in ClassB
methodBを呼び出します。
methodB in ClassB

参考情報:PHP Document#abstract


PHPでエラーになるオーバーロード

オブジェクト指向言語でいう所の「オーバーロード※」はPHP5で動作できません。
※名前は同じだけれども引数の数や型が異なるメソッドを複数用意できる。

OverloadTest.php
<?php
class ClassA
{
    function doSomething()
    {
        echo "doSomething<br>";
    }

    function doSomething($param = "")
    {
        echo "doSomething with param: " . $param . "<br>";
    }
}

$obj = new ClassA();

// 2番目のメソッドがコールされる
$obj->doSomething();
$obj->doSomething("foobar");
?>

引用元:Link

PHP5エラー

Fatal error: Cannot redeclare ClassA::doSomething() in (省略) OverloadTest.php on line 9

PHPでのオーバーロードの意味

参考情報:PHP Document#Overloading

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away