2016-07-26 54 views
-1

我有兩個類('database'和'app')。 'app'擴展'database'; 這兩個類都有名稱空間'cms'。用定義的命名空間調用類方法中的mysqli-object方法

問題是我想調用一個mysqli對象的方法close()存儲在類'數據庫'的屬性內。當我嘗試調用該方法,我得到的錯誤:

調用未定義的方法CMS \數據庫:: close()方法

我知道,爲了調用屬於PHP的功能基本名稱空間當前使用不同名稱空間時,可以在該函數前添加「\」。但是,你怎麼能用mysqli_object的方法做類似的事情(如$this->connection->close())呢?我的整個方法是錯誤的(如果是的話我應該怎麼做)?

我想這樣的事情在析構函數

call_user_method("close", $this->connection); 

,但我得到它說,「親密」不能被稱爲一個錯誤。

我的代碼如下:

的index.php

<?php 
    use cms\app; 

    require_once "class.database.php"; 
    require_once "class.app.php"; 

    $app = new app(); 
?> 

class.app.php

<?php 
namespace cms; 

use cms\database; 

class app extends database { 
    public $connection; 

    public function __construct(){ 
     $this->connection = new database(); 
    } 
} 

?> 

class.database.php

<?php 
namespace cms; 

class database { 
    public $connectionData = array (
     "server" => "localhost", 
     "user" => "root", 
     "password" => "" 
    ); 
    public $connection; 

    public function __construct() { 
     $this->connection = mysqli_connect(
      $this->connectionData["server"], 
      $this->connectionData["user"], 
      $this->connectionData["password"] 
     ); 
    } 

    public function __destruct() { 
     call_user_method("close", $this->connection); 
    } 
} 

?> 

對不起很長的職位,並感謝在adv任何幫助。

+0

如果'應用程序擴展數據庫',爲什麼你要在它的構造函數中實例化一個'新數據庫'? – deceze

+0

這個想法是設計數據庫類,使我可以獨立使用它。 – Benjamin

+0

但是我現在看到,這會產生比解決問題更多的問題,所以我會重做我的課程。 – Benjamin

回答

1

你的問題不是命名空間。在cms\database中,將$this->connection定義爲mysqli對象。因此析構函數想要對其調用$this->connection->close()。簡單直接。

cms\app現在覆蓋此並將$this->connection定義爲cms\database對象。繼承的析構函數仍然要對其調用$this->connection->close()。那麼,cms\database沒有方法close,就像錯誤說的那樣。

你的問題是:

  1. 你覆蓋__construct被定義$this->connection的東西它不應該是。根本不要覆蓋__construct和/或至少撥打parent::__construct,並且不要將$this->connection重新定義爲不同的對象。
  2. 您的cms\app正在延伸cms\database。這從表面上看並沒有太多的意義。 您的appadatabase?你可以用app的實例替換database的任何實例嗎?這在邏輯上有意義嗎?可能不會。它根本不像app應該extend database。如果你擺脫了那種奇怪的關係,你的問題也將得到解決。然後看看Dependency Injection
+1

感謝您向我展示合乎邏輯的問題。應用程序實際上不應該擴展數據庫。本來我的想法是設計數據庫類,以便我可以使用它,但這會產生太多問題。我認爲最好的方式是使用2個獨立的應用程序和數據庫。 – Benjamin