0

我正在尝试了解 spl_autoload_register()。我的 index.php 位于文档根目录下,我的 MyClass.php 位于文档根目录 /MyProject/MyClass/MyClass.php 这是我的 index.php

<?php

define('CLASSDIR', 'mylib');
define('BASEPATH',  @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR);

spl_autoload_register(null, false);
spl_autoload_extensions('.php');

// PSR-0 provided autoloader.
function autoLoader($className){

    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $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->test();
?>

这是我的课程:MyClass.php

<?php
namespace MyProject\MyClass;

class MyClass{

    public function __contruct(){
        echo('weird');
    }

    function test(){
        echo 'issue';
    }
}?>

这是错误:

Fatal error: Call to undefined method MyClass::test() in /path/to/file/index.php on line 26

所以,我假设它找到了课程(因为它没有抱怨)?但不显示消息“奇怪”和“问题”。告诉我构造函数没有触发。

4

1 回答 1

0

好的,假设您的类文件位于一个名为classes(example) 的单独文件夹中,如下所示:

DOCUMENT_ROOT/
    ->index.php
    ->classes/
        ->Myclass/
            ->Myclass.php

在你的某个地方index.php你会有这样的东西:

<?php 
DEFINE('__BASE', realpath(dirname(__FILE__)));

require_once('load.php');
?>

现在你的load.php文件应该有__autoload()函数了,看起来像这样:

// Auto load function to load all the classes as required
function __autoload($class_name) {
    $filename = ucfirst($class_name) . '.php';
    $file = __BASE . DIRECTORY_SEPARATOR .'classes/' . ucfirst($class_name) . $filename;

    // First file (model) doesnt exist
    if (!file_exists($file)) {
        return false;
    } else {
        // include class
        require $file;
    }
}

编辑:

如果你想用 来做spl_autoload_register(),你会在你的load.php

// Auto load function to load all the classes as required
    function load_classes($class_name) {
        $filename = ucfirst($class_name) . '.php';
        $file = __BASE . DIRECTORY_SEPARATOR .'classes/' . ucfirst($class_name) . $filename;

        // First file (model) doesnt exist
        if (!file_exists($file)) {
            return false;
        } else {
            // include class
            require $file;
        }
    }

    spl_autoload_register('load_classes');
于 2013-10-20T15:26:27.937 回答