PHP命名空间,use和\代表什么?它们是否自动加载类?

4
我正在尝试学习PHP 5.3/PHP 5.4的面向对象编程特性。
我已经尝试编写类似下面这样的代码。但是它并没有运行成功。
index.php
namespace Website;

use Website\Database as Database;

class Website extends Database
{
    function __construct()
    {
        echo "Test";
    }
}

$website = new Website();

./网站/数据库.php

namespace Website\Database;

class Database
{
    function construct()
    {
        echo "Hello from Database";
    }
}

我知道如何创建类、关联它们等等,但是每当我在顶部添加名称空间时,一切都会出错。
所以我想问几个基本的问题: Q1use ClassName; 是什么意思,它是否自动加载/包含类? Q2:没有左侧内容的情况下,\ 代表什么。(例如 new \Database();) Q3:在 PHP 中,\ 是否表示目录,或者这只是开发人员的处理方式? Q4:我的脚本需要做哪些更改才能使它正常工作?
2个回答

3

对于您的前三个问题,我的回答如下:

命名空间(Namespacing)!== 自动加载(Autoloading),命名空间是简化类结构的一种方式,并允许在不同命名空间中重载类;自动加载是在需要时自动加载文件:它们并不相同。如果您使用命名空间,则可能还要使用自动加载器。

“领先”的 \ 是用于命名空间的全局作用域;随后的 \ 用作命名空间分隔符

\ 是命名空间分隔符;文件规范中的目录分隔符取决于平台,可以是/\,但无论如何都应该在所有跨平台开发中使用/。还有一个DIRECTORY_SEPARATOR常量可供使用。


Q1:如果我在文件中使用use Database;,那么我需要require_once('Database.php')吗? Q2:足够清楚了。 Q3:是的,我知道这个,但是当我检查一些框架的源代码时,它们使用类似于use ExceptionHandler\FileHandler\FileUploadException;的东西,而文件的真实路径就像./ExceptionHandler/FileHandler/FileUploadException.php - 这是开发人员将其视为目录的原因吗?因为这样更容易找到他们要找的东西? - Lisa Miskovsky
Q1 - 你需要使用 require 或者包含一个可以处理命名空间类的自动加载器。 - Mark Baker
将目录结构映射到命名空间结构只是一种方便...它并不是强制性的,但使用起来更容易 - 但这两者不应被视为相同,因为这可能会导致对命名空间实际含义的误解。 - Mark Baker

2

A1:如果你使用一个尚未加载的类,自动加载器会启动。但是你需要编写自己的自动加载器来确保(命名空间)类被加载。

未经测试的示例:

function autoloader($className){
    $fileName = str_replace('\\', DIRCTORY_SEPARATOR, $className);
    include __DIR__ . $fileName;
}
spl_autoload_register(autoloader);

假设加载器位于应用程序根目录。它不进行错误检查,可能需要在某个地方添加其他目录分隔符。

A2:前导\表示全局命名空间,表示类名不在当前命名空间中。

A3:命名空间不需要匹配目录结构,但大多数开发人员会喜欢这样做。它还使自动加载更容易。


A1:有没有示例可以展示如何编写像这样的自动加载程序?我目前使用spl_autoload_register()来加载类。 A2和A3:非常清楚! - Lisa Miskovsky
1
你想查看一些符合 FIG 标准的自动加载器,例如 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 或者(推荐的选择)https://gist.github.com/jwage/221634。 - Mark Baker
@Arjan; 你能看一下我的方法吗?https://gist.github.com/Aristy/130eb1ba149af5ce9f82 它也与你的类似。它能在命名空间中工作吗? - Lisa Miskovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接