在父函数中调用子对象

时间:2016-07-05 18:02:05

标签: php oop design-patterns

我想知道如果我可以在父函数中调用子对象。像这样:

   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()与我的数据库建立连接。在我的Parent的类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());    
    }}
}

所以这是来自Above的Class Child,而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,这是与我的数据库的连接。该参数位于Child的类 $ dbc 中,并在函数Connect()中调用: $ this-&gt; dbc mysqli_error 也是如此。希望这会让事情更加清晰:)。

3 个答案:

答案 0 :(得分: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注入攻击。

答案 1 :(得分:2)

理想情况下,您不应该从父类的实例调用子函数。这是不应该做的事情。

相反,您可以覆盖子类中的函数,然后从子类的实例中调用该方法。

答案 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...")
          }
}