且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

加载类时出现spl_autoload_register问题

更新时间:2023-11-17 08:33:04

F ** k是.是的,我可以***地在公开论坛上宣誓.

F**k yes. Yes, I can take the liberty to swear on a public forum this one time.

@Shivan Raptor向他们大喊大叫,以帮助我一路走好,没有放弃.

A huge shout out to @Shivan Raptor for helping me along the way and not giving up.

自动加载器功能存在许多小问题.但是调试花了我这么长时间,原因很简单,以至于我看不到任何回显消息.只有上帝和XAMPP知道原因.好像XAMPP在第一次运行时以某种方式缓存了该类,后来没有任何更改显示任何效果.但是突然创建一个新的类和类文件开始显示我所有的回声,包括自动加载中的回声.从下面的链接中获取自动加载程序代码的任何人,请确保您查看所有变量的值.如果您没有将所有内容都保留在文档根目录中,那么它开箱即用"是行不通的.而且,如果您不熟悉PSR-0和自动加载的概念,那么这可能会杀死至少一部分功能完善的脑细胞.

There were numerous minor issues in the auto-loader function. But the debugging took me so long for just a simple reason that I couldn't see any echo messages. Only lord and XAMPP knows why. Seemed like XAMPP had somehow cached the class on first run or something and no changes later showed any effect. But creating a new class and class file all of a sudden started showing all my echo including the ones inside autoload. Anyone who has picked up the auto-loader code from the link below, please ensure you look at all the variables' values. It doesn't work "out of the box", if you don't keep everything in the document root. And if you are new to both PSR-0 and concept of auto loading, this can kill at least a sizable portion of your perfectly capable brain cells.

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

这是对我有用的最终index.php.

Here's the final index.php that worked for me.

<?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();
?>