【问题标题】:PHP Namespaces, what does use and \ means, and do they autoload classes?PHP 命名空间,use 和 \ 是什么意思,它们是否自动加载类?
【发布时间】:2013-03-17 01:01:27
【问题描述】:

我正在尝试使用 PHP 5.3/PHP 5.4 OOP 功能自学。

我尝试编写类似这样的代码。但是,它不起作用。

index.php

namespace Website;

use Website\Database as Database;

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

$website = new Website();

./Website/Database.php

namespace Website\Database;

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

我知道如何创建类,将它们相互关联等等。但是每当我将命名空间添加到顶部时,一切都会被破坏。

所以我想问一些基本的事情;

Q1use ClassName; 是否意味着它自动加载/包含该类?

Q2\ 是什么意思,左侧没有任何东西。 (例如新的 \Database();)

Q3\ 是指 PHP 中的一个目录,还是只是开发者如何看待它?

Q4:必须对我的脚本进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    回答您的前三个问题:

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

    “前导”\ 是命名空间的全局范围;和随后的\ 然后作为命名空间分隔符

    \ 是命名空间分隔符;目录分隔符在文件规范中为 /\,具体取决于平台;但是/ 无论如何都适用于所有平台,因此应该真正用于所有跨平台开发。还有DIRECTORY_SEPARATOR常量

    【讨论】:

    • Q1:所以如果我使用数据库;在一个文件中;我需要 require_once('Database.php') 吗? Q2:够清楚。 Q3:是的,我知道,但是当我检查一些框架的来源时,它们使用类似:use ExceptionHandler\FileHandler\FileUploadException;文件的真实路径类似于 ./ExceptionHandler/FileHandler/FileUploadException.php - 开发人员是否将其视为目录,因为这样更容易找到他们要查找的内容?
    • Q1 - 你要么需要,要么包含一个可以处理命名空间类的自动加载器
    • 映射到命名空间结构的目录结构只是一种方便......它不是强制性的,但它更容易使用 - 但不应将两者视为相同,因为这可能会导致误解实际上是什么命名空间
    【解决方案2】:

    A1:如果您use 一个尚未加载的类,自动加载器将启动。但您需要编写自己的自动加载器以确保(命名空间)类将被加载。

    未经测试的示例:

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

    这假定加载器位于应用程序根目录中。而且它不做错误检查,它可能需要在某处添加另一个目录分隔符。

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

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

    【讨论】:

    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2013-09-29
    • 2012-01-21
    • 2013-02-05
    • 2017-05-15
    • 2011-08-06
    • 2015-07-15
    • 2012-05-21
    相关资源
    最近更新 更多