1. MANO_fukuoka
Changes in tags
Changes in body
Source | HTML | Preview
@@ -1,22 +1,122 @@
#PHP5でStrict Standardsのワーニングが出る場合
######状況
PHP5.4以降はStrict Standardsのワーニングが表示される
######方法
+ PHP.iniで解消する方法
```ini:php.ini
- error_reporting = E_ALL | E_STRICT
+ error_reporting = E_ALL & ~E_STRICT
```
+ PHPソースに記述する方法
```php:sample.php
ini_set('error_reporting', E_ALL | ~E_STRICT);
```
-参照:[PHPマニュアル](http://php.plus-server.net/function.error-reporting.html "PHP Manual")
+参照:[PHPマニュアル error_reporting](http://php.plus-server.net/function.error-reporting.html "PHP Manual")
+参照:[PHP Document#error_reporting](http://php.net/error-reporting "PHP Documentation")
+
+
+######Warningの理由
+
+PHP5でクラスの継承を行った場合、継承元の引数の数や型が異なる場合に、ワーニングが表示されるようになりました。
+
+```PHP: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](http://www.doyouphp.jp/php5/php5_estrict.shtml)
+
+E_STRICTでのワーニング
+
+```txt
+( ! ) 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](http://php.net/manual/ja/language.oop5.abstract.php "PHP Documentation")
+
+-----
+######PHPでエラーになるオーバーロード
+
+オブジェクト指向言語でいう所の「オーバーロード※」はPHP5で動作できません。
+※名前は同じだけれども引数の数や型が異なるメソッドを複数用意できる。
+
+```php: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](http://www.doyouphp.jp/sample/sample_class_base_overload.shtml)
+
+PHP5エラー
+
+```txt
+Fatal error: Cannot redeclare ClassA::doSomething() in (省略) OverloadTest.php on line 9
+```
+
+----
+
+######PHPでのオーバーロードの意味
+参考情報:[PHP Document#Overloading](http://www.php.net/manual/ja/language.oop5.overloading.php "PHP Documentation")
+
+