加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 加载类时出现spl_autoload_register问题

发布时间:2020-12-13 21:49:40 所属栏目:PHP教程 来源:网络整理
导读:所以我之前已经在这里问过这个问题,但所提供的解决方案并不适用于我. 这是我的设置: /mylib /Vendor/Module/MyClass.php/document_root index.php 这是我的index.php ?phpdefine('CLASSDIR','mylib');define('BASEPATH',@realpath( dirname (__FILE__).'/..
所以我之前已经在这里问过这个问题,但所提供的解决方案并不适用于我.
这是我的设置:

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

这是我的index.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,$lastNsPos);
        $className = substr($className,$lastNsPos + 1);
        $fileName  = str_replace('',DIRECTORY_SEPARATOR,$namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= BASEPATH.'/'.str_replace('_',$className) . '.php';

    require $fileName; 
}

spl_autoload_register('autoLoader');

//$obj = new MyClass();

$obj = new VendorModuleMyClass();

$obj::test();

 ?>

这是我的MyClass.php

<?php

namespace VendorModule;

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('_',$className) . '.php';

它应该是:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读