【问题标题】:Is there any option for dynamical extension of class in PHP?PHP中有动态扩展类的选项吗?
【发布时间】:2012-12-28 00:18:04
【问题描述】:

我的意思是动态更改派生类的基类。例如有两个类B1B2。当我运行带有参数class=b1 的php 脚本时,该脚本中定义的类(比如class D)应该扩展class B1,否则如果参数是class=b2,它应该扩展B2

期待这样的事情

class B1{
    // some codes 
}

class B2{
    // some codes 
}

switch($_GET['class']){
   case 'b1': $baseclass = "B1"; break;
   case 'b2': $baseclass = "B2"; break;
}


class D extends $baseclass{
    // some codes 
}

PHP 中有没有这样的选项?如果有任何选项可用,请建议我。

提前致谢。

【问题讨论】:

  • 这是一种糟糕的设计方法。
  • @hek2mgl :我找到了解决问题的方法。请验证这是否是一个好方法。

标签: php class inheritance dynamic


【解决方案1】:

我不建议动态扩展类。虽然它可能是一个非常糟糕的设计,会产生许多不需要的副作用。至少告诉一个人:您将如何为该类生成 API 文档? (知道这是最小的问题)

有了来自 cmets 的附加信息:您想构建一个可以与不同数据库一起使用的 ORM 之类的东西,我首先考虑的是 PDO。它允许使用相同的接口访问大量数据库。

如果您出于某种原因需要非 PDO 解决方案,您可以进行如下设计:

<?php

class DatabaseStorage {

    /**
     * @var DB_Mysql|DB_SQLite|DB_Postgres ...
     */
    protected $database;


    /**
     * @param DB_Mysql|DB_SQLite|DB_Postgres ... The inner database to be used
     */
    public function __construct($database) {
        $this->database = $database;
    }

    /**
     *  Connect to the database
     */
    public function connect($host, $user, $password) {
        $this->database->connect($host, $user, $password);
    }


    /**
     * Query the database
     */
    public function query($query) {
        return $this->database->query($query);
    }

    // other methods may follow
}

然后像这样使用类:

$databaseType =$_GET['databaseType'];

// you should check the value before using it!!
/*if(!is_valid_database_type($databaseType)) {
    die('BAD input');
}*/

$databaseClass = 'Database' . $databaseType;
$database = new $databaseClass();

// use $database as argument to the storage constructor
$storage = new DatabaseStorage($database);

但这只是一个例子。您会找到其他方法来防止动态代码生成,

【讨论】:

  • :) 祝你好运!正如我所提到的,这只是一个示例。
【解决方案2】:

我找到了解决问题的方法。请各位大侠验证一下这是否是正确的方法。

现在我将 B1 和 B2 存储在两个单独的文件中,但类名相同并且需要动态所需的文件。

b1.php
class B{
    // some codes 
}

b2.php
class B{
    // some codes 
}

现在像这样扩展 D

$baseclass = $_GET['class'];

require_once($baseclass.'.php');

class D extends B{
    // some codes 
}

这个对我有用。 :)

【讨论】:

  • @hek2mgl 这是个好方法吗?
  • 我会说不!不要那样做!!! :) 这个想法本身,基类的动态选择,是糟糕的设计。我真的很想为您的应用程序提供一个建议,如果没有这个,我将需要更多关于您的应用程序的信息。对于 stackoverflow 来说,这可能“太多”了
  • @hek2mgl 它只是应用程序的一部分。只是为我的应用程序编写一个 ORM。示例中的 D 类将是用户可以使用 db 的通用类。 B1、B2 等将是不同类型数据库的不同基类。它的选择实际上取决于存储在配置文件中的值(仅作为示例的参数表示)。因此,如果选择 mysql,则基类 D 将派生自指定访问 mysql 数据库的基类。
【解决方案3】:

在 php 语言中永远不可能。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2017-08-15
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多