我遇到了一个由前一个员工编写的PHP类,其定义如下:
namespace SomeNamespace;
class SomeClass extends ::SomeClass
{
private function __construct() {}
public static function someFunction()
{
//Do something
}
}
有人可以解释一下这里发生了什么吗?这个班级是否在延伸?我知道单身人士会使用私人构造函数,但不确定这是发生了什么。
实际的类与缓存有关。不确定这是否有帮助。
答案 0 :(得分:6)
我不认为你可以使用 ::
来做这种事情;但如果您使用命名空间分隔符,它应该可以工作: \
我刚刚使用PHP PHP 5.3.5进行测试 - 使用::
确实让我错误。
另一方面,使用\可以正常工作(参见下面的例子)。
例如,在全局命名空间(在任何特定命名空间之外)中,您可以定义一个类SomeClass
:
namespace {
class SomeClass
{
public function method() {
var_dump("child: " . __METHOD__);
}
}
$obj = new SomeNamespace\SomeClass();
$obj->method();
}
并且,在我的示例中名为SomeNamespace
的特定命名空间中,您可以定义一个类SomeClass
,它将从全局命名空间扩展该类 - 可以作为\SomeClass
访问:
namespace SomeNamespace {
class SomeClass extends \SomeClass
{
public function method() {
var_dump("parent: " . __METHOD__);
}
}
}
旁注:在这里,我使用bracketed syntax,因为我将两部分代码放在同一个文件中(参见该手册页上的示例3) - 但它应该与几个文件一样工作。
请注意,对于PHP 5.3的第一个alpha版本,命名空间分隔符不是\
,而是::
因此,如果您使用的是PHP 5.3 alpha 1或2 (可能是3,不确定是否在alpha 3之前或之后选择了\
,请使用{{1}可能会工作。
(当然,你不应该使用alpha - 特别是考虑到已经有两年的PHP 5.3的稳定版本了)
答案 1 :(得分:2)
如果我在5.3 ::
的开发过程中正确记住,则将其用作命名空间分隔符。