php - psr-4与spl_autoload_register 加载请教!

查看:146
本文介绍了php - psr-4与spl_autoload_register 加载请教!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我用composer 是用的psr-4 现在问题来了,我有些东西不想用composer来管理加载,我自己就想用spl_autoload_register 来加载其它的文件,但是我但凡在autoload 方法里执行类相关的立马抛出无法找到此类!特别郁闷!

代码:

//重载 autoloader
spl_autoload_register([__CLASS__, 'autoload'], true, true);

public static function autoload($className) {
xxxxxxxxx::init();//一执行到这儿就报xxx类找不到
}

Fatal error : Class 'xxxxxx' not found
难道我用了psr-4我就不能再加载我自己定义的了吗?psr-0则好像没这个问题。


感谢一楼 二楼的回答。我把代码贴下

public function test(){
    \HF\Core\Config::get('keh'); //不会报错
    //重载 autoloader
    spl_autoload_register([__CLASS__, 'autoload'], true, true);
}

/**
 * 自动加载
 * @param $className
 * @return bool
 */
public static function autoload($className) {
    \HF\Core\Config::get('keh');//这里报错 提示找不到Config类
}

Config.php 这个文件是随Composer一早就载入了。工在上面test()方法里调用 都不传颂 报错的。但是我在test 方法里用了sql_autoload_register 因为我要载入我其它的类。它也不可能随composer来。但是我的Config是个核心类,我要取得各种配置合并配置都需要使用到它。所以来到autoload方法里面来 我调用Config类里的方法 直接就报找不到Config 这个类。这个类跟单例不单例 实例不实例没关系。在同一个类里,Test 方法都能调用它,唯有在spl_autoload_reigest注册的方法里无法载入类。难道我还要需要再引入一次?如果我再引入一次那我的composer自动载入还有什么意思呢?

解决方案

你的xxx类是需要用自己的autoload还是composer的去加载?

如果你的xxx类需要自己加载,那肯定要在你自己的autoload函数里require啊。

如果你的xxx类可以用composer加载,只要在composer之后注册就可以了:

<?php

require "vendor/autoload.php";

spl_autoload_register("autoload", true, false); // 注册在composer之后

<?php

spl_autoload_register("autoload", true, false);

require "vendor/autoload.php";  // composer注册时回注册到autoload队列前

针对问题补充,我想还原一个最小化的场景:

index.php

<?php

require "vendor/autoload.php";

class App {

    public function test() {
        echo \Config::get("in test") . PHP_EOL;
        spl_autoload_register([__CLASS__, 'autoload'], true, true);
    }

    public static function autoload($className) {
        echo "autoloading " . $className . PHP_EOL;
        echo \Config::get('in autoload') . PHP_EOL;
    }
}

$app = new App();
$app->test();

$other = new Other(); // 触发App::autoload, Other不存在

Config.php

<?php

class Config {
    public static function get($key) {
        return $key;
    }
}

composer.json

{
    "autoload": {
        "psr-4": {
            "": "."
        }
    }
}

看一下和你的情况有什么区别?

这篇关于php - psr-4与spl_autoload_register 加载请教!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆