Как kint выполняет синтаксический анализ функций PHP с префиксом символов (знак плюс / минус, тильда, восклицательный знак, at)?

Инструмент отладки PHP Kint имеет странный синтаксис, где определенные символы могут быть добавлены к функциям, чтобы изменить их поведение, как показано в это руководство.

Соответствующая информация:

Модификаторы — это способ изменить вывод Kint без необходимости использования другой функции. Просто добавьте к своему вызову kint префикс модификатора, чтобы применить его:

! Expand all data in this dump automatically
+ Disable the depth limit in this dump
- Attempt to clear any buffered output before this dump
@ Return the output of this dump instead of echoing it
~ Use the text renderer for this dump

Example:

+Kint::dump($data); // Disabled depth limit
!d($data); // Expanded automatically

Как это работает?

Глядя на исходный код, кажется, что символы анализируются в массиве $modifiers, Но как вы можете сделать это с PHP? И какова область этого, могу ли я сделать это с другими символами юникода, или эти пять (+, -, ~,!, @) Единственные.

‘@’ Уже используется в PHP в качестве префикса, смотрите: Какая польза от символа @ в PHP?. Как это можно отменить?


Редактировать: дополнительный вопрос к данным ответам заключается в том, как именно kint изгибает (php) правила. Например, почему ~ не дает синтаксической ошибки. Рассмотрим этот пример:

<?php
function d($args) {
echo $args[0];
}
d([1,2,3]); // prints 1
~d([1,2,3]); // syntax error, unsupported operand types

против

<?php
require 'kint.php';
~d([1,2,3]); // prints the array with the text renderer with no issues

Я вижу, что сам Кинт использует eval() (что должно быть серьезной проблемой безопасности), но я не могу понять, как это работает.

2

Решение

Извините за задержку с ответом. Я просто читал документацию Kint и задавал тот же вопрос. После нахождения вашего вопроса я решил разобраться. Возможно, вы уже поняли это, но вид фактически читает исходный код файла, который вызвал его, чтобы изменить его поведение в зависимости от того, присутствовал ли какой-либо из этих «модификаторов».

Это поведение абсолютно непредсказуемо, насколько я понимаю, и я не могу поверить, что кто-то использовал бы этот вид трюка в качестве чего-либо, кроме доказательства концепции. В частности, поскольку файл должен быть читаемым, модификаторы kint завершаются неудачно в коде eval () (который не следует использовать для начала), а также, возможно, и в других необычных случаях.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]