PHP Внутренний вопрос разработки, хотите расширить фигурный синтаксис с помощью функции цитирования - PullRequest
0 голосов
/ 01 февраля 2020

Я знаю, что это немного оффтоп c для SO, учитывая, что у меня нет кода и мой вопрос абстрактный.

Я хочу добавить функциональность в язык PHP:
Существующая функциональность:

$var=123;
$string = "This is a {$var} variable";

Требуются новые функциональные возможности для SQL переменных:

$var="asd' union ()";
$string = "This is a {(QUOTE)$var} quoted variable";

Или:

$var="asd' union ()";
$string = "This is a {QUOTE($var)} quoted variable";

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

Мой вопрос:
Есть ли способ написать php модуль / расширение, которое обеспечит такую ​​функциональность?
Если да, то где мне искать, чтобы начать быстро?

Решение

function _quote($v) { return strtoupper($v); }
$_Q = '_quote';
$string = "This is an {$_Q($var)} integer";
echo $string;

Я думаю, это самое близкое из того, что я хочу, без необходимости взламывать php сам

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Пожалуйста, используйте подготовленные заявления для SQL. Кроме того, прочитайте это: https://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/

Не нравится готовые операторы, не является причиной их не использовать, вместо этого, возможно, найти доверенную библиотеку, которая обрабатывает их лучше, делает это по-другому, или, возможно, даже переключитесь на ORM.

Чтобы больше сосредоточиться на своем вопросе, может быть проще выполнить sh то, что вы хотите, используя что-то вроде усов, разветвления и многоуровневой настройки. https://github.com/bobthecow/mustache.php

Я очень сомневаюсь, что вы сможете создать модуль для обеспечения такого рода функциональности. Большинство модулей предоставляют очень специфическую / изолированную дополнительную функциональность. Я не могу думать о модуле, который изменяет поведение конструкций на родном языке. Чтобы сделать это, вам нужно изменить PHP само ядро, что означает написание некоторого C, а затем развертывание версии PHP, которая не совместима ни с чем другим.

0 голосов
/ 01 февраля 2020

Вообще говоря, представленный вами вариант использования наименее полезен, поскольку вы все равно должны использовать параметризованные запросы. Вы можете быть после решения не той проблемы. Однако для расширения самого языка необходимо изменить синтаксический анализатор. Это влечет за собой знание YA CC и C, а также некоторые знания PHP внутренних органов. Это отнюдь не тривиальная вещь в вашем случае, особенно потому, что вы не просто изменяете, как PHP анализирует строку, но также и как она компилирует коды операций, которые влекут за собой выполнение функции.

Вы можете Прочитайте подробный пост в блоге о том, как подойти к вашей идее в блоге Никиты , если вам интересно. Хотя я бы сказал, что гораздо проще решить вашу непосредственную проблему выхода из строк в SQL, чем пытаться изменить весь PHP язык.


Дать более подробное объяснение внутренностей о том, как синтаксический анализатор PHP работает в этом ответе, будет исчерпывающим. Вот почему я ссылаюсь на наиболее технически правильное объяснение проблемы, о которой я знаю.


Важное примечание

Просто чтобы прояснить это не может быть расширением. Вы не расширяете PHP. Вы буквально меняете это. Поскольку PHP Parser должен быть скомпилирован из самого себя (да, мы компилируем компилятор), вы не можете просто предоставить общий объект для этого. Вы должны построить все дерево php -sr c с нуля, включая сам синтаксический анализатор (который обычно упакован с php).

Следствием этого является то, что вы теперь разветвили свой собственный реализация языка PHP, который больше не совместим с defacto PHP.

Другими словами ... вы владеете им на всю жизнь .

...