我正在尝试使用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 :我的脚本需要做些哪些更改才能让它发挥作用?
答案 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:命名空间不需要与目录结构匹配,但大多数开发人员会更喜欢它。它还使自动加载变得更容易。