我对OOP (PHP)很陌生,刚刚遇到了设计模式-- singleton。我找到了一个使用mysqli (singleton类)的DB类。我向它添加了一些自定义方法(insert_id()、query()、fetch_result()等)。
然后,我创建了一个名为UserTools的新类,并希望扩展数据库类,以使用我之前创建的方法(query()、fetch_result()等)。但我知道这个错误:
致命错误:从(.)中的无效上下文调用私有Database::__construct()当我尝试创建新类的实例时(用户工具)。
我该怎么办?这是一个正确的结构吗?
发布于 2011-10-04 16:24:50
有几种方法可以实现你想要的。
其中之一是:
class UserTools {
private $db;
function __construct() {
$this->db = Database::db_connect();
}
function login() { /* ... */}
}尽管最好像这样直接将数据库实例传递给构造函数:
class UserTools {
private $db;
function __construct($db) {
$this->db = $db;
}
function login() { /* ... */}
}
// Usage
$userTools = new UserTools(Database::db_connect());如果您真的很懒,只需修改数据库类并使构造函数公开:
class Database {
/* ... */
public function __construct(){/* ... */}
/* ... */
}
class UserTools extends Database {/* ... */}但我真的不鼓励你使用后一种。这是非常糟糕的代码,从逻辑的角度来看,这是没有意义的。UserTools类使用作为数据库实例。这是而不是数据库。
发布于 2011-10-04 16:01:13
据我理解,只有protected和public方法和变量是通过扩展继承的,而不是私有的。尝试将方法/变量从private更改为protected。public对所有人都是可见的。
有关更多信息,请参见:PHP可见性(手册)
编辑
了解单身模式。它被称为“单例”,因为只需要一个类的一个实例。正因为如此,大多数实现单例模式的类将构造函数定义为私有函数,以限制您创建多个构造函数。
要创建单例实例,大多数类都定义某种类型的getInstance静态方法,该方法是公共的。此公共方法调用私有构造函数,该构造函数可能设置标记,指示类已被实例化,以防止进一步尝试实例化类。getInstance方法返回调用构造函数的结果,实质上是类的实例。
发布于 2011-10-04 15:54:00
你可以写点什么
class UserTools extends DB {
....
}一个关于PHP继承的快速示例:
class A {
public $a;
public function set_a($new_a) { $this->a = $new_a; return $this; }
public function get_a() { return $this->a; }
}
class B extends A {
public $b;
public function set_b($new_b) { $this->b = $new_b; return $this; }
public function get_b() { return $this->b; }
}
$objb = new B();
$objb->set_a("Some Value")->get_a(); //Some Valuehttps://stackoverflow.com/questions/7650586
复制相似问题