【问题标题】:Why is Composer not loading a PSR-4 autoload?为什么 Composer 不加载 PSR-4 自动加载?
【发布时间】:2014-11-01 09:42:29
【问题描述】:

我正在尝试使用 composer vimeo 包 "vimeo/vimeo-api": "dev-master"。

在作曲家自己的 ClassLoader.php 中事情变得丑陋,在下面的函数中,它达到了:if (0 === strpos($class, $prefix)) 并跳出循环,因为此时 $class = 'Vimeo' 和 $prefix = 'Vimeo/' 所以结果是错误的。

private function findFileWithExtension($class, $ext)
{
    // PSR-4 lookup
    $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

    $first = $class[0];
    if (isset($this->prefixLengthsPsr4[$first])) {
        foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
            if (0 === strpos($class, $prefix)) {
                foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
                    if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
                        return $file;
                    }
                }
            }
        }
    }
    ...

vimeo 包内的 composer.json 文件声明了一个 'Vimeo\' 的 psr-4 自动加载,如下所示:

{
    "name": "vimeo/vimeo-api",
    "description": "Official PHP library for the Vimeo API.",
    "homepage": "https://github.com/vimeo/vimeo.php",
    "keywords": ["vimeo", "video"],
    "license": "Apache-2.0",
    "authors": [
        {
            "name": "Vimeo",
            "homepage": "http://vimeo.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-4": {
            "Vimeo\\": "src/Vimeo"
        }
    }
}

composer创建的autoload_psr4.php如下:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Vimeo\\' => array($vendorDir . '/vimeo/vimeo-api/src/Vimeo')
);

所以当我来实例化类'new Vimeo('arg','arg');'我收到一个找不到类的错误。

这可能与我在 Zendframework (1.12.8) 中运行的事实有关,还是作曲家搞砸了或其他原因?

【问题讨论】:

  • 我不确定你为什么要浏览这些文件,为什么不使用 vendor/autoload.php ?
  • 是的,我正在使用 vendor/autoload.php,但由于它无法加载类,所以我在代码中查看它失败的位置。

标签: php namespaces composer-php psr-4


【解决方案1】:

没错。一位同事找到了解决方案:我们需要为 composer 在实例化 composer-managed 类时使用的命名空间添加前缀。所以new Vimeo\Vimeo($foo, $bar) 有效,或者在创建实例new Vimeo($foo, $bar) 之前放置use Vimeo\Video。

【讨论】:

  • 嗯,这是一个非常基本的错误。您要使用的类名为 \Vimeo\Vimeo,因此您必须使用此绝对名称或在类文件开头使用 use Vimeo\Vimeo 将该命名空间类导入您自己的命名空间。
  • 是的。但正如我提到的,我仍在使用 Zend 框架 1,它没有在它自己的类中实现 PSR 命名空间......所以我没有想到。
猜你喜欢
  • 2014-07-25
  • 2015-04-20
  • 2018-07-25
  • 2014-08-12
  • 1970-01-01
  • 2014-03-24
  • 2018-06-01
  • 2019-04-20
  • 2017-02-01
相关资源
最近更新 更多