【问题标题】:PHP object inheritage from class constructor - the right wayPHP对象从类构造函数继承——正确的方法
【发布时间】:2013-02-02 12:31:52
【问题描述】:

我需要一些关于 php 对象继承情况的指导。 我有: 像这样的配置对象:

configuration{
    var driver = 'mysql'; // or 'mssql';
    var host = 'database_host';
    var user = 'database_user';
    var password = 'database_password';
    var name = 'database_name';
}

两个数据库处理程序类:

class mysql{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

class mssql{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

还有某种类控制器:

class database{
    public function __construct(){
        $configuration = new configuration;
        /*
         * now, depending on the value of the $configuration->driver
         * my database class must inherit methods from mysql or mssql class
         */
        switch( $configuration->driver ){
            case 'mysql':
                // database inherit mysql methods
            break;
            case 'mssql':
            // database inherit mssql methods
            break;
        }
    }
}

用法如下:

$database = new database;
$database->query( 'select * from some_table' );
$result = $database->result();

所以,当我使用我的 database 类方法时,根据 configuration 对象,我实际上使用 mysqlmssql强>方法。 我看到它的方式是不通的,因为我希望我的 database 类继承类 constructor 中的另一个类。

我希望有人能给我一个建议,告诉我如何才能做到这一点.. 让我们说.. 正确的方法。

谢谢。

【问题讨论】:

  • 我在这里没有看到任何继承 - database 应该扩展一些东西吗?
  • 您似乎在谈论“工厂”模式。查一下,可能有助于回答你的问题
  • 对于halfer问题,我想要某种动态扩展;问题是我不知道父类是什么,直到数据库构造器中的“切换”。
  • 对于thaJeztah,我将记录工厂模式,谢谢

标签: php class inheritance


【解决方案1】:

nonono,这不是 oop-thinking。您应该谷歌以下关键字:

当你这样做时,将 switch 语句放入工厂,使类 mysql 成为一个名为 DBDriver 的接口,并在你的数据库类中使用策略模式。

【讨论】:

  • 谢谢,我会做一些研究。问题是,在发布这个问题之前,我已经阅读了有关“接口”的信息,但我并没有完全使用它。经过研究,我会回来的:-)
【解决方案2】:

如果有人像我一样困惑,阅读这篇文章,这就是我找到的解决方案(经过数周的研究 - 是的,数周后):

使用单例模式,创建一个名为数据库的父类:

class database{
    protected static $instances = array();

    // method to create a new instance of this object
    public function getInstance( $driver ){
        $instanceid = md5( $driver );

        if( self::$instances[ $instanceid ] == null ){
            self::$instances[ $instanceid ] = new $driver;
        }

        return self::$instances[ $instanceid ];
    }

    public function testFunction(){
        //do something else
    }
}

然后创建驱动函数

class mysql extends database{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

class mssql extends database{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

现在像使用它

$database = database::getInstance( 'mysql' );
$database->query(); // works
$database->testFunction(); // works to

你还可以使用和喜欢

$database = database::getInstance( 'mssql' );
$database->query(); // works
$database->testFunction(); // works to

我需要向 Froncoise 道歉,因为我取消选中他的答案是正确的。

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 2014-01-31
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多