6

Новый self против нового static

13

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

Какова разница между new self и new static?

2 ответ(ов)

0

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

Вот пример:

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"

Как видно, оба метода create1() и create2() возвращают экземпляр класса B. Метод create1() создает новый объект, используя get_class($this), что гарантирует создание экземпляра текущего класса, а метод create2() использует static, что также ссылается на класс B из-за механизма позднего статического связывания. Это демонстрирует, что оба варианта работают корректно для динамического создания объектов текущего класса.

0

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

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

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

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

$Foo = new Foo;
echo $Foo->name; // Фатальная ошибка

Используя self:::

class Foo {
    public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo

Обратите внимание, что комментарий о фатальной ошибке в моем коде не указывает конкретно, где произошла ошибка, она случилась ранее, до создания объекта, как упомянул @Grapestain в комментариях.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь