對PHP建構函數的理解

巴扎黑
發布: 2016-11-23 11:35:47
原創
1091 人瀏覽過

做專案的時候遇到了一些錯誤,最終分析,是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 &#39;this is B()&#39;;
}
public function __construct(){
echo &#39;this is __construct()&#39;;
}
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 &#39;this is __construct()&#39;;
}
public function X(){
echo &#39;this is X()&#39;;
}
public function other(){
//do something
}
}
$x = new X();
?>
登入後複製

其實,從php5.3.3開始,與類別名稱相同的方法不再做為類別的建構方法,命名空間類別也一樣,要是使用的是php5.3.3以上的版本,就不能用與類別同名的方法作為構造方法了: 

<?php
namespace Foo;
class Bar {
    public function Bar() {
        // PHP 5.3.0-5.3.2 是构造方法
        // PHP 5.3.3 被当做是正常的方法使用
    }
}
?>
登入後複製

如果非要在php5.3.3以上同時使用兩個構造器,那麼可以這樣: 

<?php
class Y{
//构造器
public function __construct(){
self::Y();
}
public function Y(){
echo &#39;this is __construct() called Y()&#39;;
// do init
}
public function other(){
//do something
}
}
$y = new Y();
?>
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!