2011-02-02 33 views
0

我的問題是使用Codeigniter自定義庫,但我認爲它不是特定於PHP的構造函數,更多與使用構造函數有關。 我試圖創建笨這樣的定製控制器庫...關於在PHP中使用構造函數的問題

class MY_Controller extends Controller { 
    var $data = array(); 

    function MY_Controller() { 
     parent::Controller(); 
     $this->data['err'] = 'no'; 

     $this->load->helper('utilities'); 
    } 
} 

現在我創建一個笨控制器類這樣的...

class api_controller extends MY_Controller { 
    function get_data() { 
     $this->data['view'] = "data"; 
     $this->load->view("data_view", $this->data); 
    } 
    function get_xml() { 
     $this->data['part'] = "xml"; 
     $this->load->view("data_view", $this->data); 
    } 
} 

我想問的是,如果當我訪問類似api_controller/get_dataapi_controller/get_xml的URL時,控制器類擴展了MY_Controller,那麼父類的構造函數總是被調用,即總是調用MY_Controller()

我是在推斷更正以下

get_data() called 
-> $data => array ('err' => 'no', 'view' => 'data') 

get_xml() called 
-> $data => array ('err' => 'no', 'part' => 'xml') 

回答

4

您的代碼看起來像它的使用對構造方法PHP4語法。您應該切換到PHP5語法。

PHP4:

class MyClassName { 
    function MyClassName() {...} //constructor. 
} 

PHP5:

class MyClassName { 
    function __construct() {...} //constructor. 
} 

然後,您可以通過從子類的__constructor()方法中調用parent::__constructor();調用父類的構造函數:

class MyClassName extends SomeOtherClass { 
    function __construct() { 
     //...code here runs before the parent constructor. 
     parent::__construct(); 
     //...code here runs after the parent constructor. 
    } 
} 
+1

升級到CI 2.0以正確使用__construct()一路通過或某些版本的PHP將無法正確處理構造函數。某些版本可以將__construct()映射到PHP4風格的Controller,但是CI 2.0只是刪除了所有PHP 4風格的構造函數。 – 2011-02-03 11:22:21

2

對於PHP一般父類的構造不叫默認情況下,如果孩子有一個構造函數。 Constructors。它可以使用parent :: _ construct()來調用;

如果您使用的是PHP 5+,則應該使用函數__construct()而不是舊樣式的新建議樣式,並將其命名爲與該類相同的函數。

至於CI特定的東西,我幫不了你,對不起!

0

是的,它總是被調用的父構造函數(然而,你也許想重寫它們作爲__construct(),也可以考慮在codeigniter 2.0中)。 如果你真的有疑問折騰它echo並親自看到它。

如果你還沒有覆蓋__construct()MY_Controller然後Controller__construct()將獲得運行$這個 - >數據部分是正確的我

2

如果你重寫它,然後調用parent::__construct()那麼它將運行你自己和父母的。

所以,如果你想讓它運行父母和你自己,你會做這個

class MY_Controller extends Controller 
{ 
    var $data = array(); 

    function __construct() 
    { 
     parent::__construct(); 
     // Your code here 
    } 
} 
0

你對數據數組內容的肯定是正確的。在你的代碼中你寫道:

function MY_Controller() { 
    parent::Controller(); 

所以父母的類構造函數被調用。有很多關於PHP4和PHP5語法的評論,但基本上一直沒有問題。

在你的問題你寫

,如果延長MY_Controller控制器類實例化

這是不正確的。該實例是類api_controller的一個對象,調用MY_Controller構造函數是使用同一個對象創建的。這是不一樣的,這是多態現象的基礎。

0
class Blog extends CI_Controller { 

     public function __construct() 
     { 
      parent::__construct(); 
      // Your own constructor code 
     } 
}