Есть ли изменения в asserts в PHP7?

Хотел в коде написать проверку:
assert('is_subclass_of($classname, BasicClass::class)', 'Класс быть наследником BasicClass');

Всё бы ничего, но оказалось что assert это как eval, и про текущий нэймспэйс и загруженные классы он ничего не знает. Пришлось написать так:
assert('is_subclass_of($classname, "Name\Space\BasicClass")', 'Класс быть наследником BasicClass');

Приемлемо в общем, но в приступе негодования успел написать репорт на bugs.php.net, где быстро получил "Not a bug" с комментарием про который собственно и возникает вопрос:
If you want to stay in the same context, don't use strings and pass your expression directly. In PHP 7 this will incur no cost if asserts are disabled.
И вот я смотрю на списки изменений в PHP 7 и нигде не вижу, чтобы в ассертах что-либо изменилось. 3v4l.org намекает, что стало лучше, но разброс времени настолько незначителен, по сравнению с разбросом в минорных релизах, что тоже сомнительно. Сам is_subclass_of, наверное, сильно изменился в связи с изменениями во внутренностях, но как функцией был, так и остался, и время на его вызов тратится. Так где же правда?

P.S. Уточняю вопрос: правда ли вызов assert(is_subclass_of(...)) будет бесплатен? И какие изменения в движке к этому привели?
  • Вопрос задан
  • 577 просмотров
Пригласить эксперта
Ответы на вопрос 1
prototype_denis
@prototype_denis
Symfony
В ответе на ваше сообщение имели ввиду такое поведение.
<?php

namespace First
{
    class A
    {
        const classname = '\First\A';
    }
    
}

namespace Second\First
{
    class A {}
}


namespace Second
{
    class B extends \First\A { }
    
    $classname = '\Second\B';
    // true (\First\A::classname) 
    var_dump(assert('is_subclass_of($classname, First\A::classname)')); 

    // Undefined class constant 'classname' (\Second\First\A::classname)
    var_dump(assert(is_subclass_of($classname, First\A::classname)));
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы