PHP命名空间,使用什么和\的意思,他们自动加载类?

时间:2013-03-16 16:32:03

标签: php namespaces

我正在尝试使用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();

./网站/ database.php中

namespace Website\Database;

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

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

所以我想问一些基本的东西;

Q1 use ClassName;是否意味着自动加载/包含课程?

Q2 \表示左侧没有任何内容。 (例如new \ Database();)

Q3 \是指PHP中的目录,还是开发人员将其视为目录?

Q4 :我的脚本需要做些哪些更改才能让它发挥作用?

2 个答案:

答案 0 :(得分:3)

回答你的前三个问题:

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

“领先”\是命名空间的全局范围;然后将\用作命名空间分隔符

\是命名空间分隔符;根据平台,目录分隔符在filespecs中为/\;但是/无论如何都适用于所有平台,所以应该真正用于所有跨平台的开发。还有DIRECTORY_SEPARATOR常数

答案 1 :(得分:2)

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

未经测试的例子:

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

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

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

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