composer - PHP 使用 use 导入命名空间,并 include 了autoload.php 还是提示not found ?
PHPz
PHPz 2017-04-11 09:42:14
[PHP讨论组]

我用 composer 安装了一个包,按照文档来写代码,但调试的时候发现一直提示not found。
我以为是我代码问题,所以另外创建了一个 test 文件,代码如下:

<?php
    use Lcobucci\JWT\Configuration;
    require_once dirname(__FILE__).'/vendor/autoload.php';
    $config = new Configuration();
?>

访问该 test 文件还是提示找不到包,报错信息如下:

PHP Fatal error:  Class 'Lcobucci\\\\JWT\\\\Configuration' not found in /Library/WebServer/Documents/server/test1.php on line 4

PHP 版本:5.5.27

系统:macOS 10.12.2

安装 composer 的方法(不是使用 homebrew 安装的):http://docs.phpcomposer.com/0...*nix
composer 安装这个包的方法:composer require lcobucci/jwt
composer.json 里面有这个包的信息

目录结构:

代码是先在一个目录里写的(包也是先安装在那个目录),然后把代码复制到了 web 的目录里面,不知道会不会有影响

Lcobucci的目录结构:

autoload.php是 composer 自己生成的,代码如下:

<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit407d4e074f96f6dd999e37ef003e6a2b::getLoader();

autoload_real.php代码如下:

<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit407d4e074f96f6dd999e37ef003e6a2b
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit407d4e074f96f6dd999e37ef003e6a2b', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit407d4e074f96f6dd999e37ef003e6a2b', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit407d4e074f96f6dd999e37ef003e6a2b::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        return $loader;
    }
}

(突然发现 composer 生成的 PHP 文件都没有PHP 代码标记的结束符 ?> 。会有问题么? composer 是大量使用的工具,自动生成的东西应该不会有问题吧)

PHPz
PHPz

学习是最好的投资!

全部回复(1)
PHPz

顺序不对,你得先注册自动加载,再use。因为你这个use是需要psr-4支持的,vendor/autoload.php就是提供这个支持的。

<?php
    require_once dirname(__FILE__).'/vendor/autoload.php';
    # use 会调用类注册, 前提是你得先导入相应的类注册方法(autoload.php)
    use Lcobucci\JWT\Configuration;
    
    $config = new Configuration();
?>

<?php
    require_once dirname(__FILE__).'/vendor/autoload.php';
    $config = new \Lcobucci\JWT\Configuration;
?>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号