gpt4 book ai didi

php - 如何在没有 Composer 作为依赖项的情况下使用具有命名空间的 PHP 库(PSR-0)?

转载 作者:行者123 更新时间:2023-12-03 00:08:15 24 4
gpt4 key购买 nike

我需要使用一些具有依赖关系的 PHP 库,但我对客户端的网络服务器有一些限制。它是一个托管网络服务器,我无法通过 SSH 使用控制台。

那么我现在如何在没有 Composer 的情况下使用这些库呢?
我可以手动创建一些目录吗?我需要创建哪些目录或路径?另外,我需要创建什么才能使自动加载和命名空间正常工作?

我可以手动创建 autoload.php 吗?该文件的内容是什么?

最佳答案

使用简单的自动加载器就可以做到这一点,而且并不难做到:

function __autoload($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';
// $fileName .= $className . '.php'; //sometimes you need a custom structure
//require_once "library/class.php"; //or include a class manually
require $fileName;

}

但有时您必须调整 $fileName 以便它适用于所有库。这取决于自动加载的标准以及库的类名的命名方式。有时,您必须在 _ 上拆分类名,并使用第一个元素作为目录名称,并将其也添加到类名中。例如,我有第二个库,其中包含像 Library_Parser 这样的类,但结构是 Library/library-parser.php

第一个库直接使用上面的代码,所有类都会自动加载。

代码取自http://www.sitepoint.com/autoloading-and-the-psr-0-standard/但我必须纠正一些代码部分(额外的下划线和反斜杠)。我使用的是 PSR-0 标准溶液。

PSR-4 版本 https://stackoverflow.com/users/1740659/thibault :

function loadPackage($dir)
{
$composer = json_decode(file_get_contents("$dir/composer.json"), 1);
$namespaces = $composer['autoload']['psr-4'];

// Foreach namespace specified in the composer, load the given classes
foreach ($namespaces as $namespace => $classpaths) {
if (!is_array($classpaths)) {
$classpaths = array($classpaths);
}
spl_autoload_register(function ($classname) use ($namespace, $classpaths, $dir) {
// Check if the namespace matches the class we are looking for
if (preg_match("#^".preg_quote($namespace)."#", $classname)) {
// Remove the namespace from the file path since it's psr4
$classname = str_replace($namespace, "", $classname);
$filename = preg_replace("#\\\\#", "/", $classname).".php";
foreach ($classpaths as $classpath) {
$fullpath = $dir."/".$classpath."/$filename";
if (file_exists($fullpath)) {
include_once $fullpath;
}
}
}
});
}
}

loadPackage(__DIR__."/vendor/project");

new CompanyName\PackageName\Test();

关于php - 如何在没有 Composer 作为依赖项的情况下使用具有命名空间的 PHP 库(PSR-0)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22388647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com