Инструмент отладки 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()
(что должно быть серьезной проблемой безопасности), но я не могу понять, как это работает.
Извините за задержку с ответом. Я просто читал документацию Kint и задавал тот же вопрос. После нахождения вашего вопроса я решил разобраться. Возможно, вы уже поняли это, но вид фактически читает исходный код файла, который вызвал его, чтобы изменить его поведение в зависимости от того, присутствовал ли какой-либо из этих «модификаторов».
Это поведение абсолютно непредсказуемо, насколько я понимаю, и я не могу поверить, что кто-то использовал бы этот вид трюка в качестве чего-либо, кроме доказательства концепции. В частности, поскольку файл должен быть читаемым, модификаторы kint завершаются неудачно в коде eval () (который не следует использовать для начала), а также, возможно, и в других необычных случаях.
Других решений пока нет …