Класс расширяется? - PullRequest
8 голосов
/ 20 июля 2011

Я обнаружил PHP-класс, написанный предыдущим сотрудником, который определен так:

namespace SomeNamespace;

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

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

Кто-нибудь, пожалуйста, объясните, что здесь происходит? Этот класс расширяется? Я знаю, что синглтон будет использовать частный конструктор, но не уверен, что именно это здесь и происходит.

Фактический класс связан с кэшированием. Не уверен, поможет ли это.

Ответы [ 2 ]

6 голосов
/ 20 июля 2011

Я не думаю, что вы можете делать такие вещи, используя ::;но это должно работать, если вы используете разделитель пространства имен: \

Я только что протестировал с 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__);
        }
    }

}


Sidenote: Здесь я использую синтаксис в скобках , так как я помещаю две части кода в один файл (см. Пример 3 на этой странице руководства) - но он должен работать одинаково с несколькими файлами.



Обратите внимание, что в первых альфа-версиях PHP 5.3 разделитель пространства имен был не \, а ::

Итак, если вы используетеPHP 5.3 alpha 1 или 2 (и, возможно, 3, не уверен, что \ был выбран до или после alpha 3) , использование :: может работать.

(Конечно, вы не должны использовать альфа-версию - особенно если учесть, что уже два года существуют стабильные версии PHP 5.3)

2 голосов
/ 20 июля 2011

Если я правильно помню, во время разработки 5.3 :: использовался как разделитель пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...