加载类时spl_autoload_register问题


spl_autoload_register issue while loading class

所以我之前已经在这里问过这个问题,但提供的解决方案对我不起作用。这是我的设置:

/mylib
    /Vendor/Module/MyClass.php
/document_root
    index.php

这是我的索引.php

<?php

define('CLASSDIR', 'mylib');
define('BASEPATH',  @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR);
spl_autoload_register(null, false);
spl_autoload_extensions('.php');
function autoLoader($className){
    $className = ltrim($className, '''');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '''')) {
        echo 'does it come here? nope.'; 
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('''', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    require $fileName; 
}
spl_autoload_register('autoLoader');
//$obj = new MyClass();
$obj = new 'Vendor'Module'MyClass();
$obj::test();
 ?>

这是我的我的班级.php

<?php
namespace Vendor'Module;
class MyClass{
    public function __construct(){
        echo 'weird';
    }
    public function test(){
        echo 'strange';
    }
}
?>

我的回声都没有显示任何东西。显然我的类也没有加载。相反,我收到此错误。

Fatal error: Call to undefined method MyClass::test() in /<documentroot>/index.php on line 29

请帮忙。我已经坚持了一段时间了,我的其余发展正在遭受痛苦。我尝试搬到spl_autoload_register()只是因为这是推荐的方式。现在失去的时间让我后悔。

您错误地调用了test()函数(使用静态方式?

调用函数:

$obj = new MyClass();
$obj->test();

如果你打算使用像 MyClass::test() 这样的静态方法,在你的类中声明你的函数为:

public static function test() {
}

此外,您的自动加载机过于复杂。它可以简化为:

$class_dir = array(
    '/mylib/Vendor/Module/',
    // Add more paths here ( or you can build your own $class_dir )
);
function class_loader($class_name) {
    global $class_dir;
    foreach ($class_dir as $directory) {
        if (file_exists($directory . $class_name . '.php')) {
            require_once($directory . $class_name . '.php');
            return;
        }
    }
}
spl_autoload_register('class_loader');

第3次编辑:

我注意到您设置的路径不正确。

$fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

它应该是:

$filename = BASEPATH .'/' . $filename . str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

如前所述,可以通过回显$filename的值轻松调试。

F**k 是的。是的,我可以冒昧地在公共论坛上发誓。

向猛禽@Shivan大喊大叫,感谢他一路上帮助我,没有放弃。

自动加载器功能中存在许多小问题。但是调试花了我这么长时间,原因很简单,我看不到任何回显消息。只有领主和XAMPP知道为什么。似乎 XAMPP 在第一次运行时以某种方式缓存了该类或其他东西,后来没有任何更改显示出任何效果。但是创建一个新的类和类文件突然开始显示我所有的回声,包括自动加载中的回声。任何从下面的链接中获取自动加载器代码的人,请确保您查看所有变量的值。如果您不将所有内容都保留在文档根目录中,它将无法"开箱即用"地工作。如果你对PSR-0和自动加载的概念都是新手,这至少可以杀死你完全有能力的脑细胞的很大一部分。

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

这是对我有用的最终索引.php。

<?php
define('CLASSDIR', 'mylib');
define('BASEPATH',  @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR);
spl_autoload_register(null, false);
spl_autoload_extensions('.php');
function autoLoader($className){
    $className = ltrim($className, '''');
    $classPath  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '''')) {    
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $classPath = str_replace('''', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR;
    }
    $fileName = BASEPATH.'/'.$classPath.str_replace('_', DIRECTORY_SEPARATOR, $className).'.php';
    require $fileName;
}
spl_autoload_register('autoLoader');
$obj = new 'Vendor'Module'MyClass();
$obj::test();
?>