Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何扩展变量的使用_Php_Oop - Fatal编程技术网

Php 如何扩展变量的使用

Php 如何扩展变量的使用,php,oop,Php,Oop,这个代码不起作用 我想创建一个DB类,然后有一些DB驱动程序:mysql、mssql v..v。 $db='mysql'所以我希望DB类扩展mysql。类扩展类,而不是变量 $laca = 'laca'; class laca(){ /*Code*/ } class foo extends $laca; 类扩展类,而不是变量 $laca = 'laca'; class laca(){ /*Code*/ } class foo extends $laca; 不要扩展laca类,

这个代码不起作用

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

类扩展类,而不是变量

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

类扩展类,而不是变量

$laca = 'laca';  
class laca(){ /*Code*/ }  
class foo extends $laca;
不要扩展laca类,而是将其传递给foo类,以便它可以使用它

class a {
    // Code
}

class b extends a {
    // Code
}
不要扩展laca类,而是将其传递给foo类,以便它可以使用它

class a {
    // Code
}

class b extends a {
    // Code
}

如果不使用
eval()
,这似乎是不可能的
extends
需要正确限定的类名,并且在任何情况下都不能是变量。

如果不使用
eval()
,这似乎是不可能的<代码>扩展
需要一个正确限定的类名,并且在任何情况下都不能是变量。

我认为这里真正需要的是一个DBFactory:

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);


事实上,我认为您想要使用

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

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);


事实上,我认为你想用

我认为你做得不对

您应该做的是创建一个层次结构:有一个基本的
DB
抽象类来定义适用于所有数据库类型的公共行为,然后为每个数据库创建一个单独的类来扩展基类。换句话说,类似这样的事情:

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

class MysqlDB{}

$db = DBFactory::create('mysql');
然后,根据需要的数据库,创建适当类的实例:

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) {
        //...
    }
}

我认为你做得不对

您应该做的是创建一个层次结构:有一个基本的
DB
抽象类来定义适用于所有数据库类型的公共行为,然后为每个数据库创建一个单独的类来扩展基类。换句话说,类似这样的事情:

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

class MysqlDB{}

$db = DBFactory::create('mysql');
然后,根据需要的数据库,创建适当类的实例:

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) {
        //...
    }
}

我个人会在任何适合的地方使用它。有时我甚至会将类标识符放在后面。原因是,如果您的类中有侦听器、线程或其他内部类,您可能会感觉更好、更清晰,以避免冲突。

我个人会在任何适合的地方使用它。有时我甚至会将类标识符放在后面。原因是,如果你的类中有侦听器、线程或其他内部类,你可能会感觉更好、更清晰,以避免冲突。

我认为OP想要做的是扩展一个直到运行时才知道名称的类。我认为OP想要做的是扩展一个直到运行时才知道名称的类。你或者其他人,请更新帖子,以便执行/保留突出显示和格式设置?不要将一个问题替换为另一个问题。将答案标记为“已接受”,然后打开一个新问题。请您或其他人更新帖子,以便执行/保留突出显示和格式设置。不要将一个问题替换为另一个问题。将答案标记为“已接受”,并打开一个新问题。我希望用户设置一个db类型使用的变量,然后他们可以在基本db上使用它:class db{$db='mysql';->然后使用mysql class}我希望用户设置一个db类型使用的变量,然后他们可以在基本db上使用它:class db{$db='mysql';->然后使用mysql class}