2011-07-20 42 views
8

我遇到一个以前的员工写了一个PHP类,它是这样定义的:类扩展自己?

namespace SomeNamespace; 

class SomeClass extends ::SomeClass 
{ 
    private function __construct() {} 

    public static function someFunction() 
    { 
     //Do something 
    } 
} 

会有人请解释一下是怎么回事?这个班是自我扩展吗?我知道一个单身人士会使用私人构造函数,但不知道这是发生在这里的事情。

实际的类与缓存有关。不知道这是否有帮助。

+2

它执行没有错误?你确定这两个类都在同一个命名空间吗? – zzzzBov

+2

好问题!从来没有见过这样的代码。要么以前的员工是天才,要么是疯子。 – GordonM

+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的α1或2 (也许3,不知道如果\之前或之后选择3),使用::可能工作。

(当然,你不应该使用的α - 尤其是考虑到已经有PHP 5.3的稳定版本了两年)

+0

之前是的!我们正在运行PHP的Alpha版本。我们现在不需要对此发表评论:-) –

+2

呃,你真的真的不应该用阿尔法来运行 - 特别是这样一个老的!当你切换到一个稳定的版本,所有的命名空间代码将打破... *(对不起,我无法抗拒评论^^很高兴我可以帮忙,虽然)* –

+0

哈哈是的,它是可怕的! –

2

如果我的5.3的开发过程中记住正确::被用作命名空间分隔符。