Pull to refresh

Comments 18

А если проект использует
$v = 'xdebug_var_dump';
$v('test');

для примера, то мы отключим по логике xdebug.

Ну и таких способов — миллион. Например, можно еще использовать eval.
Согласен, сканер не гарантирует 100% точности.
И наоборот — к примеру, имена функций могут храниться в базе и в коде вызываться динамически.

Поэтому надо перед отключением хотя бы проанализировать список самому.
Имхо, такому проекту уже ничего не поможет.
call_user_function тоже криминал?
нет, это не криминал. Но, это разные вещи.

Если я увижу в коде call_user_function — я буду знать, что сейчас будет вызвана функия (или метод класса). Причем сразу видно имя функции / метода.

Если я увижу в коде $v('test') — то сейчас должно произойти? $v — это функция или объект?
Кстати, IDE в данном случае корректо отработает, если это будет объект и запутается, если это будет функция.
$v('test') — это функция, всегда, объектом может быть только new $v('test'), чтобы у объекта работал $v('test') у него должен быть метод __invoke, который, о чудо, заставляет объект эмулировать функцию. call_user_function нужен если есть нужда вызывать методы объектов в виде array($object, 'method'), но и накладные расходы при вызове у него больше, так как это функция, а variable functions — языковая конструкция.
А как же кложур? $v = function($c){ echo $c; }; $v('test'); Вот вам и без new $v :)
Капитан подсказывает, что это анонимная функция
По сути она является объектом Closure. Но да, можно считать её функцией. Просто вызывается вышеупомянутый __invoke из объекта вот и все дела с «функцией».
$v('test') — это функция, всегда, объектом может быть только new $v('test'), чтобы у объекта работал $v('test') у него должен быть метод __invoke


Ну да, вы повторяете очевидные вещи, которые описаны по ссылке, которую я привел в комментарии выше. И наличие у объекта метода __invoke не должно удивлять, например, в zend framework 2 он используется.

Только, повторюсь. $v('test') не всегда функция, вот пример из документации:
class CallableClass
{
    public function __invoke($x)
    {
        var_dump($x);
    }
}
$v = new CallableClass;

$v(5);


Соответственно, как я и писал, если в коде встретить

$v('test');


то непонятно, это функция или объект.
Нет, вы что, издеваетесь, а call_user_func($v) — здесь вам понятно функция это или объект?
У меня складывается впечатление, что мы говорим о разных вещах.
call_user_func(string) — функция
call_user_func(array) — метод объекта

Или я не правильно понял вопрос?
А также call_user_func(любой объект с методом __invoke, включая Closure).
Без цифр — в статье нет смысла. Если прирост на уровне 1-2% смысла дёргаться нет. Если хотя бы 10% — можно подумать
Не соглашусь. Все зависит от проекта. Даже если прирост будет в 0.1%, умножаем его на пару миллионов запросов в сутки = экономия процессорного времени, ради которой стоит этим заняться.
UFO just landed and posted this here
Sign up to leave a comment.

Articles