【问题标题】:php create objects from list of class filesphp从类文件列表中创建对象
【发布时间】:2012-04-24 10:25:34
【问题描述】:

我的项目中有包含文件的目录 CLASSES。

../classes/class.system.php
../classes/class.database.php
...

我提取每个类并使用以下代码将其包含在主 index.php 中:

// load classes
foreach (glob("classes/class.*.php") as $filename) {
    require_once $filename;
}

然后我创建(手动编写)对象,例如:

$system = new System();
$database = new Database();
...

问:如何在不写入的情况下,从目录 CLASSES 中的文件列表中自动为每个类生成对象?

感谢您的回答和代码。

编辑:

我的工作解决方案

// load classes
foreach (glob("classes/class.*.php") as $filename) {
    require_once $filename;
    $t = explode(".",$filename);
    $obj = strtolower($t[1]);
    $class = ucfirst($t[1]);
    ${$obj} = new $class();
}

【问题讨论】:

    标签: php class object auto-generate


    【解决方案1】:

    如果你遵循一个典型的模式,在创建这些文件时像

    class.<classname>.php

    然后

    foreach (glob("classes/class.*.php") as $filename) {
        require_once $filename;
        $t = explode(".",$filename);
        ${strtolower($t[1])}= new ucfirst($t[1])(); // automatically create the object        
    
    }
    

    【讨论】:

    • 我需要生成 $system = new System();在php页面内,所以这不起作用。变量 $obj 未定义,类的首字母必须大写,类名后有“()”。
    • 我认为课后缺少“();”更好的解决方案是使用 ucfirst() 函数
    • @ing.MichalHudak,是的,我错过了括号...,并且更正了 ucfirst()
    【解决方案2】:

    我不认为使用glob 加载所有类并在需要或不需要时包括它们是有效的或好的主意性能明智。如果你有500 different classes ???

    你为什么不利用PHP自动加载见http://php.net/manual/en/language.oop5.autoload.php,它只会加载你需要的类

    例子

    function __autoload($className) {
        require_once "classes/class." . $className . ".php";
    }
    
    $system = new System();
    $database = new Database();
    

    【讨论】:

    • 你对 glob() 函数有所了解。但是这个项目只有不到 20 个班级。这样做的好处是我可以在 1 内自动创建对象并加载类。
    • 20 级现在肯定会增长....尝试我使用最佳实践....包括 20 级和 1 级..肯定会有区别
    【解决方案3】:
    // load classes and create objects
    foreach (glob("classes/class.*.php") as $filename) {
        require_once $filename;
        $t = explode(".",$filename);
        $obj = strtolower($t[1]);
        $class = ucfirst($t[1]);
        // create object for every class
        ${$obj} = new $class();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-16
      • 2022-01-14
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2022-01-17
      相关资源
      最近更新 更多