Можете ли вы объявить переменную PHP на одну область? - PullRequest
0 голосов
/ 02 ноября 2011

ЦЕЛЬ: Объявить / установить переменные в области действия функции, вызвавшей выполняемую функцию.

ОПИСАНИЕ:
Привет, переполнение,

Я хочу добавить еще один маленький кусочек сахара в утилиту, которую я использую во многих своих php-функциях. Это позволяет мне определить гибкий контракт на ввод моих функций. За несколько итераций я сократил его до использования, которое выглядит следующим образом:

function doSomething($param_arr){
    FPX::contract(array(
        'required' => array("length", "width", "height", "weight"),
        'optional' => array("circumference")
    ));
    $length = $parr['length'];
    $width = $parr['width'];
    $height = $parr['height'];
    $weight = $parr['weight'];
    $circumference = $parr['circumference'];
    ....
}

FPX :: contract () автоматически захватывает $ param_arr и анализирует его, чтобы убедиться, что он совместим с определенным контрактом.

Что я хотел бы сделать сейчас, так это избавить от необходимости объявлять каждую из переменных впоследствии. Есть ли способ, которым я могу, внутри самой нижней функции, объявлять переменные в области действия вызывающей ее функции? Таким образом, FPX :: contract () должен иметь возможность устанавливать переменные, входящие в сферу применения doSomething (), чтобы мне не приходилось объявлять каждую из этих переменных. (Я не хочу объявлять глобалы).

В идеале это будет выглядеть так:

function doSomething($param_arr){
        FPX::contract(array(
            'required' => array("length", "width", "height", "weight"),
            'optional' => array("circumference")
        ));
    ....
}

И тогда doSomething () сможет получить доступ к каждой из переменных, перечисленных в контракте, как $ length, $ width и т. Д.

Мне известен синтаксис функции ($ var0, $ var1, $ var2 = null), но использовать этот синтаксис с большим количеством необязательных переменных не так просто.

Спасибо, Кен

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011

Может быть, вы можете что-то сделать с extract () ?

То есть просто сделайте, чтобы ваш contract () возвратил массив или ссылку на массив, а затем извлек ().

4 голосов
/ 02 ноября 2011

Вы можете сделать что-то вроде

extract(FPX::contract(array(
        'required' => array("length", "width", "height", "weight"),
        'optional' => array("circumference")
    )));

Это немного отличается от той идеи, которая у вас была, но результат должен быть таким, какой вы ожидали.

extract(array('foo'=>'bar'));
echo $foo;

http://php.net/extract

0 голосов
/ 02 ноября 2011

Должны ли они быть набором переменных, а не ассоциативным массивом?

$parsedParams = FPX::contract(array(
    'required' => array("length", "width", "height", "weight"),
    'optional' => array("circumference")
  ),
  $param_arr
);

echo $parsedParams['length'];
echo $parsedParams['circumference'];
...