【问题标题】:PHP inheritance concerning mysqli关于mysqli的PHP继承
【发布时间】:2012-12-16 00:06:29
【问题描述】:

我创建了一个名为 Database 的类。

class Database extends mysqli {

    public function __construct() {
        parent::__construct();
        $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);

        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
    }   
}

还有一个扩展数据库的名为 Model 的类

class Model {

    function __construct() {
        $this->db = new Database();        
    }
}

还有一个扩展 Model 的类 registerModel

class registerModel extends Model {

    public function __construct() {
        echo "This is the register Model";
    }

    public function register(//VARIOUS PASSED VALUES) {
        **$stmt = $mysqli->prepare("INSERT INTO users (firstName, lastName) values (?, ?)");**
        ...
        ... More Code
        ...

    }

我想做的是从原始数据库类中获取$mysqli,但我不确定如何引用它。我已经尝试了所有方法,但似乎没有任何效果。

附: 在我的应用程序中总是需要前两个类,最后一个 registerModel 类是通过控制器调用的。这就是为什么我不在子类中构造父类的原因。

【问题讨论】:

  • 一个建议:不要在构造函数内部创建带有new() 的类,而是从外部将它们作为参数传递。

标签: php mysql mysqli scope


【解决方案1】:

使其成为Database 类中的一个字段:

class Database extends mysqli {
    public $mysqli;

    public function __construct() {
        parent::__construct();
        $this->mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);

        if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
    }   
}

那你可以这样引用:

$stmt = $<strong>this-&gt;db-&gt;</strong>mysqli-&gt;prepare("INSERT INTO users (firstName, lastName) values (?, ?)");

但你还需要保留父构造函数:

echo "This is the register Model";
parent::__construct();

最后,你的Database不应该扩展mysqli因为你实际上并没有使用那个继承;你正在创建一个完全不同的对象。

【讨论】:

  • 这不起作用,因为registerModel 中的__construct 将覆盖Database 中的__construct
  • 啊,我明白了。我在不需要的地方放置了“$”变量标记。非常感谢您的帮助。
【解决方案2】:

在你的注册模型中,构造函数需要调用父构造函数

<?php
class registerModel extends Model {
public function __construct() {
    echo "This is the register Model";
    parent::__construct();
}

然后你就可以从

$this->db

【讨论】:

  • 这行得通。它覆盖了__construct,但它调用parent::__construct()来获取变量$mysqli
  • 非常感谢,当我不应该这样做的时候,我把美元符号放在了这样的 $this->$db 上。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多