常见的父类

时间:2013-11-24 17:19:34

标签: php mysql oop

我有一些变量和函数需要可用于不同的类。因此,我将所有定义(变量/函数)放到某个类中:

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()被执行多次。一些想法?

2 个答案:

答案 0 :(得分:0)

如果我是你,我会重新设计我的实施。为什么?好吧,因为在我看来,some_other_classitem 都不是 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;
    }

}

现在发生的事情是itemsome_other_class对象都有一个依赖关系,我们注入common_functions。这显然意味着你必须将一些值传递给common_functions中的方法,但考虑到你没有继承common_functions会得到什么,这只是一个非常小的代价,比如只有一个db-connection。

继承很酷但实际上并没有那么多使用。组合对象通常比继承一堆东西要好得多。在设计OO类时,始终考虑对象关系是is ahas a关系。

所以使用上面的订单构造函数示例你可以做的如下:

class orders {

    private $common_functions;

    public function __construct($common_functions) {
        $this->common_functions = $common_functions;
        $order_item = new Item($common_functions);
    }

}

这样,itemorder都会共享相同的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值以外的任何其他处理程序