php spl_autoload无法处理语法错误的命名空间

时间:2012-08-24 09:59:10

标签: php namespaces syntax-error

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

但这会导致错误 *致命错误:spl_autoload()[function.spl-autoload]:无法在第18行的C:\ my_projects \ site.local \ www \ index.php中加载类空间*

的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,但在我的情况下,我需要了解构建函数的工作原理

2 个答案:

答案 0 :(得分:3)

new space/my;

应该是

new space\my;

注意:您错过了()

__construct的{​​{1}}

答案 1 :(得分:2)

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

new space/my;

让我们把它分开:

  • new - new keyword,我们用它来实例化一个新对象。
  • space - 类的名称,此处为字符串"space"
  • / - division operator
  • my - (未定义?)常量my,如果未定义,将导致字符串"my"

由于这一点(即语言),PHP自然会尝试实例化类space,然后尝试将其与字符串"my"分开。例如:

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

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

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

希望这有帮助。请注意PHP有松散的输入,以便可以实例化would have produced probably a division by zero warning的现有类。

调试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