类扩展自己?

时间:2011-07-20 19:26:47

标签: php oop syntax

我遇到了一个由前一个员工编写的PHP类,其定义如下:

namespace SomeNamespace;

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

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

有人可以解释一下这里发生了什么吗?这个班级是否在延伸?我知道单身人士会使用私人构造函数,但不确定这是发生了什么。

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

2 个答案:

答案 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 ::的开发过程中正确记住,则将其用作命名空间分隔符。