php - psr-4与spl_autoload_register 加载请教!
ringa_lee
ringa_lee 2017-04-10 17:57:00
0
2
412

我用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自动载入还有什么意思呢?
ringa_lee
ringa_lee

ringa_lee

Antworte allen(2)
Peter_Zhu

你的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": {
            "": "."
        }
    }
}

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

黄舟

我明白你的意思,xxx类是单例模式吧,你是想在第一次用到该类到时候,就调用xxx::init()去初始化类实例。

对吧?

但是,你的spl_autoload_register 先于composer运行,所以没有composer去帮你require这个类文件,你在这里直接使用,当然会报错 类不存在。

所以解决方法很简单,那就是你在xxx::init();之前,先require这个类文件。就好了。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!