如何扩展使用变量

时间:2010-07-15 08:12:57

标签: php oop

$laca = 'laca';  
class laca(){ /*Code*/ }  
class foo extends $laca;

此代码不起作用。

我想创建一个DB类,然后有一些DB驱动程序:mysql,mssql v..v。 $db = 'mysql';所以我希望DB类扩展mysql。

6 个答案:

答案 0 :(得分:3)

而不是扩展 laca类,传递给foo类,以便它可以使用它。

class foo {
    function __construct($laca) {
        $this->laca = $laca;
    }

    function storeWidgets($widgets) {
        foreach ($widgets as $widget) {
            $this->laca->saveWidget($widget);
        }
    }
}

...

$laca = new laca();
$foo = new foo($laca);

答案 1 :(得分:1)

我认为你真正想要的是DBFactory:

class DBFactory {
    public static function create($driver) {
        switch(strtolower($driver)) {
            case 'mysql':
                return new MysqlDB();
        }
    }
}

class MysqlDB{}

$db = DBFactory::create('mysql');

实际上,我认为你想使用PDO

答案 2 :(得分:0)

类扩展了类,而不是变量。

class a {
    // Code
}

class b extends a {
    // Code
}

答案 3 :(得分:0)

如果不使用eval(),这似乎是不可能的。 extends需要一个合格的类名,在任何情况下都不能成为变量。

答案 4 :(得分:0)

我认为你做得不对。

你应该做的是创建一个层次结构:有一个基础DB抽象类,它定义了适用于所有数据库类型的通用行为,然后为每个数据库扩展基类有一个单独的类。换句话说,就像这样:

abstract class DB {
    public function __construct($host, $username, $password) {
        $this->connect($host, $username, $password);
    }
    abstract public function connect($host, $username, $password);
    abstract public function query($sql);
}

class MySQL extends DB {
    public function connect($host, $username, $password) {
        //...
    }
    public function query($sql) {
        //...
    }
}

然后,根据您需要的数据库,创建适当类的实例:

if ($dbtype == 'mysql') {
    $DB = new MySQL($host, $username, $password);
}
else if ($dbtype == 'mssql') {
    $DB = new MySQL($host, $username, $password);
}
//...

答案 5 :(得分:0)

我个人在适合的任何地方使用它。有时我甚至把类标识符放在后面。理由,如果你的课程中有听众,线程或其他内部课程,你可能会感觉更好更清楚,以避免冲突。