0

我从 http://www.php.net/manual/ru/function.spl-autoload.php#92767得到这个例子

但这会导致错误 *致命错误:spl_autoload() [function.spl-autoload]: Class space could not be loaded in C:\my_projects\site.local\www\index.php on line 18*

/index.php

// Your custom class dir
define('CLASS_DIR', 'oop/classes');

// Add your class dir to include path
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);


// You can use this trick to make autoloader look for commonly used "My.class.php" type filenames
spl_autoload_extensions('.class.php');

// Use default autoload implementation
spl_autoload_register();

new space/my;

/oop/classes/space/my.class.php

namespace space;
class my{
  public function __construct{
    var_dump('space class was here!');
  }
}

我知道 PSR-0,但就我而言,我需要了解内置函数的工作原理

4

2 回答 2

3
new space/my;

应该

new space\my;

注意:你错过()__constructmy.class.php

于 2012-08-24T10:06:12.837 回答
2

以下代码行可能是语法错误,因为您没有使用您可能想到的语言语法:

new space/my;

让我们把这里的东西分开:

  • new-new关键字,我们用它来实例化一个新对象。
  • space- 类的名称,这里是字符串"space"
  • /-除法运算符
  • my- (undefined?) 常量,如果未定义my将导致字符串。"my"

正因为如此(这就是语言),PHP 自然会尝试实例化该类space,然后尝试将其与 string 分开"my"。例子:

$object = new space;
define('my', 0);
$result = $object / my;

由于您使用自动加载和类space不存在,您会看到致命错误。

严格来说,语法错误不是在 PHP 中,而是使用了错误的语法(这里:/而不是\使用正确的符号来分隔命名空间)。

希望这会有所帮助。注意 PHP 的类型很松散,因此可以实例化的现有类可能会产生除以零警告

调试spl_autoload_register由于这是一个内部函数,当使用时没有自动加载回调函数,您可以使用以下扩展它以进行调试:

spl_autoload_register(funcion($class) {
    echo 'Autoloading class: ', var_dump($class), "\n";
    return spl_autoload($class);
});

此外,您可能想要添加您的扩展而不是覆盖现有的:

($current = spl_autoload_extensions()) && $current .= ',';
spl_autoload_extensions($current . '.class.php');
# .inc,.php,.class.php
于 2012-08-24T10:49:05.953 回答