我是php的新手我想编写php代码来理解命名空间,有两个文件index.php
和autoload.php
并且有一个名为Lib
的目录是两个文件,并将其称为first.php
和second.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
答案 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 )。