Новая личность против новой статики - PullRequest
464 голосов
/ 04 марта 2011

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

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

Ответы [ 3 ]

813 голосов
/ 04 марта 2011

получу ли я такие же результаты?

Не совсем.Однако я не знаю обходного пути для 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
18 голосов
/ 11 июля 2012

Если метод этого кода не является статичным, вы можете обойти в 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"
5 голосов
/ 24 августа 2018

В дополнение к ответам других:

static :: будет вычислено с использованием информации времени выполнения.

Это означает, что вы не можете использовать static:: в свойстве класса, так как значения свойств:

Должен иметь возможность быть оцененным во время компиляции и не должен зависеть от информации времени выполнения.

class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

Использование self::

class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...