做專案的時候遇到了一些錯誤,最終分析,是php的建構方法在作怪,這裡重新整理了一下:
php5開始可以在類別中聲明__construct建構方法,當物件被實例化的時候,該方法被調用。
注意:
1.如果在繼承的子類別中沒有建構方法而父類別中有建構方法,那麼當實例化子類別時,父類別的建構方法會被隱含呼叫。
2.如果子類別有建構方法,父類別中也有建構方法,那麼子類別要顯示呼叫parent::__construct()才能父類別的建構方法。
為了向後相容,如果在php5類別中沒有找到__construct()方法,它會去找與類別名稱相同的方法名稱的建構器,但是如果同時使用兩個建構器,有可能會發生E_STRICT 級別的錯誤訊息:
(以下程式碼是個人web環境:win32+php5.3.8+apache2.2測試)
<?php class B{ //构造器 public function B(){ echo 'this is B()'; } public function __construct(){ echo 'this is __construct()'; } public function other(){ //do something } } $b = new B(); ?>
結果:Strict Standards: Redefining already defined constructor for class B in D:xampphtdocstest3Class. ready defined constructor for class B in D:xampphtdocstest3Class. ready defined constructor for class B in D:xampphtdocstest3Class. is __construct()
但僅調換下方法的位置結果卻不一樣:
<?php class X{ //构造器 public function __construct(){ echo 'this is __construct()'; } public function X(){ echo 'this is X()'; } public function other(){ //do something } } $x = new X(); ?>
<?php namespace Foo; class Bar { public function Bar() { // PHP 5.3.0-5.3.2 是构造方法 // PHP 5.3.3 被当做是正常的方法使用 } } ?>
<?php class Y{ //构造器 public function __construct(){ self::Y(); } public function Y(){ echo 'this is __construct() called Y()'; // do init } public function other(){ //do something } } $y = new Y(); ?>