0

我正在尝试创建一个具有 GeneralObj 的系统。GeneralObj 允许用户使用表名字符串为数据库表启动特殊对象。到目前为止,它运行完美。

class GeneralObj{
    function __construct($tableName) {
        //...
    }
}

但是,每次都输入 new GeneralObj(XXX) 太累了。我想知道是否可以将过程简化为喜欢 new XXX(),它实际上与 new GeneralObj(XXX) 运行相同?我发现 PHP 在设置 include_path 中提供了用于动态加载文件的 __autoload 方法,但它需要一个存在的实际定义文件。我真的不想复制和复制相同的定义文件,只是稍微改变一下。

出于原因, eval 不是一种选择。

4

4 回答 4

2

也许您可以在自动加载器中自动创建文件:

function __autoload($class_name) {
    // check for classes ending with 'Table'
    if (preg_match('/(.*?)Table/', $class_name, $match)) {
        $classPath = PATH_TO_TABLES . '/' . $match[1] . '.php';
        // auto-create the file
        if (!file_exists($classPath)) {
            $classContent = "
class $class_name extends GeneralObj {
    public __construct() {
        parent::__construct('{$match[1]}');
    }
}";
            file_put_contents($classPath, $classContent);
        }
        require_once $classPath;
    }
}
于 2013-04-05T09:16:49.010 回答
1

使用继承。使 GeneralObj 成为表特定类的超类。通过这种方式,您可以动态派生类名并实例化对象。例子:

class someTable extends GeneralObj {

}


$tableName = 'some';
$className = $tableName . 'Table';

$obj = new $className;
于 2013-04-05T09:40:48.483 回答
0

不,这是不可能的。

runkit扩展允许对 PHP 运行时环境进行编程操作,但它不能这样做。即使可以,恕我直言,这将是一个非常糟糕的主意,极大地影响了应用程序的要求和复杂性,以换取节省一些击键。

在不相关的注释中,您的GeneralObj类具有听起来像依赖注入容器的可疑功能。也许您应该考虑用一个替换它?

于 2013-04-05T09:01:14.190 回答
0

像这样的自动加载器:

myAutoloader::Register();


class myAutoloader
{
    /**
     * Register the Autoloader with SPL
     *
     */
    public static function Register() {
        if (function_exists('__autoload')) {
            //  Register any existing autoloader function with SPL, so we don't get any clashes
            spl_autoload_register('__autoload');
        }
        //  Register ourselves with SPL
        return spl_autoload_register(array('myAutoloader', 'Load'));
    }   //  function Register()


    /**
     * Autoload a class identified by name
     *
     * @param   string  $pClassName     Name of the object to load
     */
    public static function Load($pClassName){
        if (class_exists($pClassName,FALSE)) {
            //  Already loaded
            return FALSE;
        }

        $pClassFilePath = str_replace('_',DIRECTORY_SEPARATOR,$pClassName) . '.php';

        if (file_exists($pClassFilePath) === FALSE) {
            //  Not a class file
            return new GeneralObj($pClassName);
        }

        require($pClassFilePath);
    }   //  function Load()

}

如果无法实例化表类,则由 GeneralObj 引发异常

于 2013-04-05T09:14:37.900 回答