在 PHP 中自动加载类的最佳方法

2022-08-30 16:30:33

我正在处理一个项目,其中我有以下文件结构:

index.php
|---lib
|--|lib|type|class_name.php
|--|lib|size|example_class.php

我想自动加载类,class_name和example_class(命名为与PHP类相同),以便在索引中.php这些类已经实例化,所以我可以做:

$class_name->getPrivateParam('name');

我在网上看了一下,但找不到正确的答案 - 任何人都可以帮助我吗?

编辑

感谢您的回复。让我详细介绍一下我的方案。我正在尝试编写一个WordPress插件,该插件可以放入项目中,并通过将类放入插件内部的文件夹“功能”中添加其他功能。永远不会有1000个班级,一推一下可能10个?

我可以编写一个方法来循环访问“lib”文件夹的文件夹结构,包括每个类,然后将其分配给一个变量(类名),但并不认为这是一种非常有效的方法,但也许这是实现我需要的最佳方式?


答案 1

如果您需要自动加载类 - 将命名空间和类名约定与 SPL 自动加载一起使用,这将节省重构时间。当然,您需要将每个类实例化为一个对象。谢谢。

就像在这个线程中一样:PHP自动加载命名空间

但是,如果您想要一个复杂的解决方法,请查看Symfony的自动加载类:https://github.com/symfony/ClassLoader/blob/master/ClassLoader.php

或者像这样(我在我的一个项目中做了):

<?
spl_autoload_register(function($className)
{
    $namespace=str_replace("\\","/",__NAMESPACE__);
    $className=str_replace("\\","/",$className);
    $class=CORE_PATH."/classes/".(empty($namespace)?"":$namespace."/")."{$className}.class.php";
    include_once($class);
});
?>

然后你可以像这样实例化你的类:

<?
$example=new NS1\NS2\ExampleClass($exampleConstructParam);
?>

这是你的类(在 /NS1/NS2/ExampleClass 中找到.class.php):

<?
namespace NS1\NS2
{
    class Symbols extends \DB\Table
    {
        public function __construct($param)
        {
            echo "hello!";
        }
    }
}
?>

答案 2

如果您有权访问命令行,则可以在 classMap 部分中使用 composer 进行尝试,如下所示:

{
    "autoload": {
        "classmap": ["yourpath/", "anotherpath/"]
    }
}

然后你有一个wordpress插件来启用wordpress cli中的作曲家:http://wordpress.org/plugins/composer/


推荐