如何声明全局命名空间?

时间:2014-07-04 18:58:40

标签: php namespaces

我是php的新手我想编写php代码来理解命名空间,有两个文件index.phpautoload.php并且有一个名为Lib的目录是两个文件,并将其称为first.phpsecond.php,但当我运行我的代码时,我看到此错误

 require(Test\Lib\firstnamespce\First.php): failed to open stream:

我知道我没有以正确的方式使用命名空间,但我不明白我哪里出错了,如何在课堂上调用我的函数,我读了一些关于命名空间和psr-0的文章但是我更困惑的是这里是我的代码

First.php:

namespace Test\Lib\firstnamespce;
class First {
public function hello(){
echo "Hello world";
}}

Second.php:

namespace Test\Lib\secondnamespace;
class Second {
public function hello(){
echo "Hello world";

}}

autoload.php

function autoload($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 .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    require $fileName;
}
spl_autoload_register('autoload');

的index.php:

require('autoload.php');

$obj1 = new Test\Lib\firstnamespce\First();
$obj2 = new Test\Lib\secondnamespace\Second();
$obj1->hello();
$obj2->hello();

这是我的代码层次结构:

Test
|
|--- Lib
|       |
|       ----First.php
|       |
|       ----Second.php
|
|----index.php
|----autoload.php

1 个答案:

答案 0 :(得分:0)

require适用于文件系统路径。如果您的命名空间与目录/文件名不对应,则不能直接在文件系统上使用该命名空间。正如您的错误消息所示,Test\Lib\Firstnamespace\First.php不存在。

如果我正确地阅读您的问题,您将拥有以下文件结构:

  ./index.php
  ./Autoload.php
  ./Lib/first.php
  ./Lib/second.php

如果您希望您的需要工作,那么您必须具有以下目录结构:

  ./Test/Lib/Firstnamespace/First.php

那么您的要求应该只是require('Lib/first.php')。请注意,许多操作系统(尤其是Unix操作系统)都区分大小写。如果您的命名空间为First并且您查找First.php,则永远不会找到first.php(带有小的 f )。