В PHP, как тело функции может ссылаться на переменные в своем динамическом родителе? - PullRequest
0 голосов
/ 01 июля 2018

В PHP можно написать

$ а = "$ B $ с";

Это элегантно объединяет предполагаемые строки в $ b и $ c в $ a (то есть, используя минимальный, но понятный синтаксис).

Теперь я хочу переместить это утверждение в функцию. Проблема в том, что $ b и $ c естественно интерпретируются как локальные для этой функции, а не ее вызывающего (который может быть глобальным кодом или функцией). Даже если вызывающая сторона определяет $ b и $ c, эта новая функция не может видеть эти определения.

Я хочу сделать что-то умное, требующее, чтобы оператор работал так же (за исключением расположения $ a), даже если он был перемещен в функцию.

Кроме того, я хочу, чтобы это было эффективно. Не использовать extract () или debug_backtrace (). Просто хочу использовать локальную область звонящего. Я не против, если я использую Zend, чтобы получить таблицу символов звонящего, или любой другой взлом, если это эффективно.

Не волнуйтесь, я не собираюсь использовать это в качестве общей практики программирования (тьфу), только для одной конкретной и замечательной цели.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Не существует встроенной функции PHP для нарушения таким образом области действия, кроме обратных ссылок, включенных в функции отладки и исключения.

Я бы посоветовал взглянуть на код C для debug_backtrace () и посмотреть, сможете ли вы написать расширение, которое реализует необходимый вам бит (поднимаясь по стеку на один шаг, чтобы найти таблицу родительских символов), но которое работает лучше чем существующая функция (я понятия не имею, если это возможно, я не знаю, откуда возникают накладные расходы).

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

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

0 голосов
/ 01 июля 2018

Я знаю, что вы не хотите извлекать, но может ли это помочь?

<?php

function foo()
{
    $b = 'Butter';
    $c = 'Cup';

    $v = get_defined_vars();
    echo bar($v);
}

function bar($v)
{
    extract($v);
    return $b . $c;
}

foo();

Выход:

ButterCup
...