4

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

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

索引.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";
    }
}

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

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

Q1:是否use ClassName;意味着它自动加载/包含类?

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

Q3 :\是指 PHP 中的目录,还是只是开发人员如何看待它?

Q4:我的脚本需要做哪些更改才能使其正常工作?

4

2 回答 2

3

回答您的前三个问题:

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

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

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

于 2013-03-16T16:38:27.960 回答
2

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

未经测试的例子:

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

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

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

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

于 2013-03-16T16:45:44.037 回答