Как получить доступ к аргументу «родительской» функции? - PullRequest
6 голосов
/ 16 июля 2011

Например, у меня есть следующий код:

function a($param)
{
  function b()
  {
    echo $param;
  }
  b();
}
a("Hello World!");

Это выдает ошибку E_NOTICE, потому что $ param, конечно, не определено (в b ()).

Я не могу передать $ paramв b () потому что b () должна быть функцией обратного вызова preg_replace_callback ().Поэтому у меня возникла идея сохранить $ param в $ GLOBALS.

Есть ли лучшее решение?

Ответы [ 4 ]

10 голосов
/ 16 июля 2011

Если вы используете PHP 5.3, вы можете использовать анонимную функцию с ключевым словом use вместо:

<?php
function a($param)
{
  $b = function() use ($param)
  {
    echo $param;
  };

  $b();
}
a("Hello World!");
1 голос
/ 16 июля 2011

Кстати, так как это было помечено функциональное программирование : в большинстве функциональных языков программирования вы бы просто ссылались на param, и это было бы по объему, без проблем.Это называется лексической областью видимости, или иногда блок-областью видимости.

Обычно это языки без явных объявлений переменных (например, «назначить для определения»), которые усложняют и / или нарушают.И Java, которая заставляет вас помечать такие переменные final.

0 голосов
/ 16 июля 2011

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

Это делает ваш код более понятным, потому что каждая функция выполняет один набор операций.

<?php
function a($param)
{
  b($param);
}
function b($param)
{
    echo $param;
}
a("Hello World!");
?>
0 голосов
/ 16 июля 2011

Я бы предложил использовать здесь объекты.

Class a {
    private $param;
    private static $instance;

    public function __construct($param){
        $this->param = $param;
        self::$instance = $this;
    }

    public function getParam(){
        return $this->param;
    }

    public static function getInstance(){
        return self::$instance;
    }

}

function b(){
    echo a::getParam();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...