2011-08-31 30 views
0

以下是我的簡化代碼我如何參考從一個類到另一個類的功能?

<?php 
    $database = new db(); 
    $file = new file(); 
    $input = new input(); 
    $output = new output(); 

    $data = "SELECT * FROM table;"; 
    $input->page($data); 

    class db { 
     public function queryExecute($var) { 
       $var = $this->queryEncode($var); 
       $var = $this->querySubmit($var); 
     return $var; 
     } 

     public function queryEncode($var) { 
       // Do somthing 
     return $var; 
     } 

     public function querySubmit($var) { 
       // Do somthing 
     return $var; 
     } 
    } 

的問題是,當我加入這代碼:

class input { 
     public function page($data) { 
       // Do something 
       $pageQuery = db::queryExecute($data); 
     } 
    } 

有了這個,有兩件事情我必須做的。首先,如果服務器設置爲嚴格,我必須隱藏db::queryExecute($data);代碼的錯誤。現在是第二個問題。如果被引用的類引用的是另一個類,但是這次是在它自己的類中,我似乎無法使用這行代碼(這是我發現可能引用其他類除了使用Abstract之外的唯一方法)。

爲了更好的解釋,該過程如下:

  1. 抓住$data變量並將其發送到$input->page()函數($input->page($data))。
  2. 參考db類,$input->page()函數通過db::queryExecute()格式(db::queryExecute($data))將信息發送到$database->queryExecute()函數。
  3. 但是由於我們在使用$this->運營商($this->queryEncode()$this->querySubmit()),$this->$database->queryExecute()引用$database->queryEncode()$database->querySubmit()使用::,目前屬於$input->而不是$database->

那麼有什麼解決方案...引用其他類不同(而不是::)?當我定義我的類時,使用$_GLOBAL變量?使用$this->以外的東西?配置所有要使用的類ABSTRACT/EXTENDS(或INTERFACE)?

輸出的下面的錯誤是指$var = $this->queryEncode($var);

Fatal error: Call to undefined method input::querySubmit() in C:\[...]\global.php on line 12

+0

發佈您收到的錯誤。 –

回答

0

不要對靜態函數進行靜態調用。將$db instance傳遞給頁面,或者提供對數據庫的全局訪問(通過全局註冊表,單例或其他方法)。但最好的做法是將依賴項 - 數據庫實例傳遞給方法。

<?php 
    $database = new db(); 
    $file = new file(); 
    $input = new input($database); 
    $output = new output(); 

    $data = "SELECT * FROM table;"; 
    $input->page($data); 

    class db { 
     public function queryExecute($var) { 
       $var = $this->queryEncode($var); 
       $var = $this->querySubmit($var); 
     return $var; 
     } 

     public function queryEncode($var) { 
       // Do somthing 
     return $var; 
     } 

     public function querySubmit($var) { 
       // Do somthing 
     return $var; 
     } 
    } 

    class input { 
    protected $_database; 
    public function __construct($database) { 
     $this->_database = $database; 
    } 
    public function page($data) { 
      // Do something 
      $pageQuery = $this->_database->queryExecute($data); 
    } 
    } 
+0

你可以給我簡要的例子和/或更好地解釋你的意思嗎?如果這不是要求太多,將依賴關係傳遞給方法? – Jonathan

+0

$ input-> page($ data,$ database); //你也可以在頁面的構造函數中傳遞數據庫。 –

+0

我試過這個,但無濟於事。我從上面給出的代碼中將第3-5行復制到'db'類的開頭,比如'private $ file = new file();'但是它給了我這個錯誤:'解析錯誤:語法錯誤,意外的T_NEW在C:\ [...] \ global中。第11行的php' – Jonathan

0

只能使用雙冒號操作者上靜態的,恆定的,或覆蓋屬性或一個類的方法。請參閱documentation。改爲使用->

+0

這是我最初的意圖,但是我無法讓' - >'工作,因爲這個變量對這個類是不可見的。 – Jonathan

相關問題