2016-07-05 111 views
4

我想知道如果我可以在父函數中調用子對象。像這樣:在父函數中調用子對象

class Parent { 

      public function A() { 
      << I want to call the object here >> 
      // Some code 
      } 
    } 

    Class Child extends Parent { 

      public function B() { 
      // Some code 
      } 
    } 

    $Child = new Child(); 
    $Child -> B(); 

這兩個類在不同的文件中。 My Child類正在使用函數B()與我的數據庫建立連接。在我父類的A()中,我試圖插入填充表單時收到的數據,但我需要連接到數據庫,我不知道如何調用該對象。注意:當我在同一個類中有兩個函數時,我的代碼正在工作。

我沒有找到解決辦法,所以我會嘗試後我的實際代碼:

class db_connect extends Model 
{ 
    private $dbname = "..."; 
    private $dbuser = "..."; 
    private $dbpass = "..."; 
    private $dbhost = "..."; 
    public $dbc; 

    public function Connect() 
    { 
     $this->dbc = mysqli_connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 

    if($this->dbc === false){ 
     die("ERROR: Could not connect. " . mysqli_connect_error());  
    }} 
} 

因此,這是從上面和connect()類兒童被B()。

現在父

class Model 
{ 
     public $query; 
     public $result; 

     public function proccess_data($marca,$model,$pret,$descriere){ 
     << I am trying to make a connection here from config.php using the function Connect() >> 
     $this->query = "INSERT INTO autoturisme (autoturism_id, marca, model, pret, descriere) " . 
    "VALUES (NULL, '$marca', '$model', '$pret', '$descriere')"; 
     $this->result = mysqli_query(<<Also here I would need the connection>>, $this->query) 
    or die(mysqli_error(<<And here>>)); 
     if($this->result == 1){ 
     echo "<br/>Your data were processed"; 
    } else { 
     echo "<br/>We are sorry but an error occurred"; 
    } 
     $this->close_db(); 

} 

mysqli_query我需要一個參數作爲mysqli的,這是我的數據庫的連接。該參數位於子級,$ dbc,它在Connect()函數中調用:$ this-> dbc。同樣適用於mysqli_error。希望這使事情更清晰:)。

回答

2

您不應該從父類的實例中理想地調用孩子的函數。這是不應該做的。

相反,您可以重寫子類中的函數,然後從子類的實例中調用該方法。

2

你可以嘗試切換它,所以父類與數據庫建立連接,併爲子類提供訪問該連接的方法。這裏是僞代碼,粗略地顯示了這將如何工作。

class Parent { 

    // method to run SQL statement 
    runSQL(SQL) { 
     // connect to database (or do it in constructor) and run the SQL 
    } 
} 

class Child extend Parent { 
      public function B() { 
       ... 
       parent::runSQL("SELECT...") 
      } 
} 
3

考慮到你已經標記了我會咬人。

有沒有理由db_connect東西永遠擴展名爲Model。更何況,沒有理由打電話Model這不告訴任何人任何東西,因此這是一個非常糟糕的名稱。

其次,據我所知,沒有理由讓你包裝mysqli開始。你通過包裝這樣的物體獲得了什麼。 mysqli帶有一個開箱即用的面向對象的界面。

最後,當你擺脫那個奇怪的繼承樹時,你應該注入數據庫連接到需要它的類中。例如:

class Car 
{ 
    // why do you need a `$query` member when you are not going to use it? 
    // same for `$result` 

    private $dbConnection; 

    public function __construct(mysqli $dbConnection) 
    { 
     $this->dbConnection = $dbConnection; 
    } 

    public function add($marca, $model, $pret, $descriere) 
    { 
     $query = 'INSERT INTO autoturisme'; 
     $query.= ' (marca, model, pret, descriere)'; 
     $query.= ' VALUES'; 
     $query.= ' (?, ?, ?, ?)'; 

     $stmt = $this->dbConnection->prepare($query); 

     $stmt->bind_param('ssss', $marca, $model, $pret, $descriere); 

     if (!$stmt->execute()) { 
      throw new \Exception('We are sorry but an error occurred'); 
     } 
    } 
} 

$mysqli = new mysqli('localhost', 'user', 'pass', 'dbname'); 

$car = new Car($mysqli); 

try { 
    $car->add('BMW', '325', 'dunnowhatthismeans', 'description?'); 
} catch(\Exception $e) { 
    echo $e->getMessage(); 
} 

另請注意,您的代碼很可能容易受到SQL注入的攻擊。