我在我的 index.php
中设置了一个非常基本的自动加载器,以在 hello.php
中获取命名空间类。我的开发环境是 Ubuntu 12.04。
我为什么要尝试这样做?我试图坚持 PSR-1和 PSR-2 coding standard ,其中包括:
Class names MUST be declared in StudlyCaps
Namespaces are as /Vendor/Class (note: capitals)
以下是我的结构和代码有效 之前 对大写字母进行更改。
文件夹结构
- web
-- index.php
-- core
--- hello.php
自动加载器
在 index.php 中,我有我的自动加载器:
set_include_path(__DIR__);
spl_autoload_extensions('.php,.class.php');
spl_autoload_register();
类文件
在核心文件夹中,我有 hello.php
namespace core;
class hello {
public function __construct() {
echo 'Constructed!';
}
}
有效的代码
如果我在我的 index.php
中运行 $obj = new\core\hello();
,我会返回“Constructed!”。太棒了!
那行不通的
将我的核心文件夹重命名为“核心”——注意大写字母 C,并将 hello.php
中的命名空间重命名为 namespace Core;
。
现在让我们再试一次 $obj = new\Core\hello();
fatal error :在 ... 中找不到类“Core\hello”
所以请告诉我,为什么我不能使用大写字母来符合 PSR 标准?我做错了什么?
最佳答案
当您在 Linux 平台上运行 PHP 代码时,请务必记住 Linux 对文件名区分大小写。
这会影响自动加载器,因为它们通常在构建要加载的文件名时使用命名空间和类名。
如果文件夹名为core
,则命名空间必须为core
,大小写相同。如果在命名空间中将其更改为 Core
,则必须对文件夹名称执行相同的操作。 (因此,所有其他 core
类必须同时更改为 Core
)。
在 Windows 上,这不会发生,因为 Windows 文件系统不区分大小写。当代码在本地基于 Windows 的开发系统上进行测试和运行时,这可能会造成混淆,然后在将其复制到基于 Linux 的服务器时中断。
[编辑]
好的,所以我错过了您也更改了目录名。但尽管如此,我仍然认为这是文件名/目录名大小写的问题。
我注意到您在调用 spl_autoload_register()
时没有任何参数。这意味着默认的 spl_autoload()
函数将用作自动加载器。
如果您阅读 the documentation for spl_autoload()
,您会注意到它使用类和命名空间的小写版本。
换句话说,使用默认的自动加载器,您的类可以大小写混合,但文件夹结构和文件名必须全部小写。
所以实际上,对您而言,您需要将文件名保持小写。
根据我最初的回答,我亲身经历了相反的情况,我有一个完全小写的文件名,当我从 Windows 开发箱转移到 Linux 服务器时,我的混合大小写类名被破坏了。我的经验与您不同的原因是因为我使用的是自定义编写的自动加载函数,它不进行自动小写转换,因此我的文件名的大小写必须与我的类名的大小写相匹配。
关于PHP - spl_autoload 和命名空间 - 不适用于大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027486/