Новая личность против новой статики

342

Я конвертирую библиотеку PHP 5.3 для работы на PHP 5.2. Главное, что стоит на моем пути, - использовать позднюю статическую привязку, например return new static($options);, если я преобразую ее в return new self($options), получаю ли я те же результаты?

В чем разница между new self и new static?

Теги:
static
late-static-binding

2 ответа

682
Лучший ответ

Я получу те же результаты?

Не совсем. Однако я не знаю об обходном пути для PHP 5.2.

В чем разница между new self и new static?

self относится к тому же классу, в котором действительно написано ключевое слово new.

static, в поздних статических привязках PHP 5.3 относится к любому классу в иерархии, на которую вы вызывали метод.

В следующем примере B наследует оба метода из A. Вызов self привязан к A, поскольку он определен в реализации A первого метода, тогда как static привязан к вызываемому классу (также см. get_called_class()).

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
  • 0
    имеет смысл. Я думаю, что лучше всего передать имя класса функции, использующей позднюю статическую привязку, а затем вернуть new $ className ($ options);
  • 12
    Вам не нужно «передавать» имя класса, вы всегда можете выполнить get_called_class() , который фактически совпадает с __CLASS__ , но совместим с LSB.
Показать ещё 5 комментариев
13

Если метод, в котором находится этот код, не является статическим, вы можете получить обход в 5.2 с помощью get_class($this).

class A {
    public function create1() {
        $class = get_class($this);
        return new $class();
    }
    public function create2() {
        return new static();
    }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

Результаты:

string(1) "B"
string(1) "B"
  • 16
    Если метод не является статичным, поздние статические привязки становятся совершенно неактуальными.
  • 1
    Например, вы можете использовать его в методе «копировать», где объект копируется без использования clone , а просто путем повторного создания и установки свойств. $copy = new static(); $copy->set($this->get()); return $copy; от $copy = new static(); $copy->set($this->get()); return $copy;
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню