我有一些变量和函数需要可用于不同的类。因此,我将所有定义(变量/函数)放到某个类中:
class common_functions() {
function __construct() {
$this->define_variables();
$this->connect_to_database();
echo "EXEC";
}
function define_variables() {
$this->var1 = "foo";
$this->var2 = "bar";
}
function connect_to_database() {
mysql_connect(...)
}
function do_something() {
//...
}
}
是所有其他人的父母:
class orders extends common_functions {
private $order_item;
function __construct() {
parent::__construct()
$order_item = new item();
}
function show_something() {
echo $order_item->get_something()*$this->var1;
}
}
class item extends common_functions {
pivate $some_number;
function __construct() {
parent::__construct()
$this->number = 123;
}
function get_something() {
return $this->var2*$this->var1*$this->number;
}
}
class some_other_class extends common_functions {
function __construct() {
parent::__construct()
}
// ..
}
然而,执行
$o = new order();
$o->show_something();
输出
EXEC
EXEC
因为common_functions类被调用两次。特别是mysql-connection也建立了好几次,效率很低。
我需要的是一些技术,以便来自common_functions的所有函数和变量(以及数据库连接)都可用于所有类,而没有例如connect_to_database()被执行多次。一些想法?
答案 0 :(得分:0)
如果我是你,我会重新设计我的实施。为什么?好吧,因为在我看来,some_other_class
和item
都不是 common_functions
。但是他们都有common_functions
。因此,我只创建该类的一个实例并将其传递给构造函数。
这样的事情:
class Item {
private $common_functions;
public function __construct($common_functions) {
$this->common_functions = $common_functions;
}
}
class Order {
private $common_functions;
public function __construct($common_functions) {
$this->common_functions = $common_functions;
}
}
现在发生的事情是item
和some_other_class
对象都有一个依赖关系,我们注入common_functions
。这显然意味着你必须将一些值传递给common_functions中的方法,但考虑到你没有继承common_functions会得到什么,这只是一个非常小的代价,比如只有一个db-connection。
继承很酷但实际上并没有那么多使用。组合对象通常比继承一堆东西要好得多。在设计OO类时,始终考虑对象关系是is a
或has a
关系。
所以使用上面的订单构造函数示例你可以做的如下:
class orders {
private $common_functions;
public function __construct($common_functions) {
$this->common_functions = $common_functions;
$order_item = new Item($common_functions);
}
}
这样,item
和order
都会共享相同的common_functions
对象。
答案 1 :(得分:-1)
最初在父类中分配一个静态null变量,并检查它是否为null。
class common_functions {
private static $dbInstance = null;
function __construct() {
if(self::$dbInstance == null) {
self::$dbInstance = $this->connect_to_database();
}
} ...
返回数据库连接处理程序或$ this-> connect_to_database();
中的null值以外的任何其他处理程序