【发布时间】:2017-06-16 16:17:08
【问题描述】:
我正在使用要求用户上传扩展程序的 CMS。
用户无权访问 composer。所以我需要在发行版本身中包含依赖项。
我如何实现它来自动加载所有依赖项?这是解决这个问题的方法吗?
这是分布式扩展的简化目录结构。 (用户应该上传上传目录的内容):
upload/Eg/
upload/Eg/autoload.php <-- autoloader to load the dependencies
upload/Eg/MyClass.php <-- requires autoload.php
upload/Eg/dependencies <-- where required composer packages are copied
upload/Eg/dependencies/guzzlehttp <-- for example
自动加载.php
spl_autoload_register(function ($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strripos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
});
MyClass.php
namespace Eg;
require './autoload.php';
use GuzzleHttp;
class MyClass {
}
旁注:我正在编写的应用程序实际上是自动“构建”扩展。从 composer 的“vendor”文件夹复制依赖是自动完成的。
【问题讨论】:
-
我不明白这是什么问题。
-
@yivi 这个实现是否有效以及它是否是一个好方法的问题。
-
你试过了吗? “这是一个好方法吗”是一个见仁见智的问题,对于 SO 来说不是一个好问题。并且首先通过实际测试代码来回答“它是否有效”。如果你这样做了,但它没有,那么你就问一个具体的问题。 :)
标签: php autoloader spl-autoload-register