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

Posted

技术标签:

【中文标题】如何在没有 Composer 作为依赖项(PSR-0)的情况下使用具有命名空间的 PHP 库?【英文标题】:How to use a PHP library with namespacing without Composer as dependency (PSR-0)? 【发布时间】:2014-04-18 18:41:48 【问题描述】:

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

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

我可以以某种方式手动创建 autoload.php,文件的内容是什么?

【问题讨论】:

接受的答案是符合 PSR-0 的,对于 PSR-4 解决方案,请参阅 ***.com/questions/39571391/… 【参考方案1】:

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

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 标准解决方案。

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

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();

【讨论】:

关于 PSR-4 解决方案,请参阅***.com/questions/39571391/…

以上是关于如何在没有 Composer 作为依赖项(PSR-0)的情况下使用具有命名空间的 PHP 库?的主要内容,如果未能解决你的问题,请参考以下文章

PHP商城 Composer 以及PSR规范

Composer:如何在没有网络连接的情况下添加依赖项?

Composer/PSR - 如何自动加载函数?

composer+psr-4实现自动加载

PSR-4 自动加载如何在 composer 中为自定义库工作?

PSR-4 没有加载我的项目类