Проблема с закрытием PHP - PullRequest
10 голосов
/ 01 июля 2011

Очевидно, что $ pid находится вне области действия здесь.Разве это не должно быть "закрыто" с функцией?Я вполне уверен, что именно так работают закрытия в javascript, например.

Согласно некоторым статьям php замыкания не работают , поэтому я не могу получить доступ к this ?

Так как же можно получить доступ к $ pid из этой функции закрытия?

class MyClass {
  static function getHdvdsCol($pid) {
    $col = new PointColumn();
    $col->key = $pid;
    $col->parser = function($row) {
        print $pid; // Undefined variable: pid
    };
    return $col;
  }
}

$func = MyClass::getHdvdsCol(45);
call_user_func($func, $row);

Редактировать Я справился с этим с помощью: $col->parser = function($row) use($pid).Однако я чувствую, что это ужасно.

Ответы [ 3 ]

25 голосов
/ 01 июля 2011

Вам необходимо указать, какие переменные должны быть закрыты следующим образом:

function($row) use ($pid) { ... }
0 голосов
/ 29 апреля 2015

Я думаю, что PHP очень согласован в области видимости переменных. Правило гласит: если переменная определена вне функции, вы должны указать ее явно. Для лексической области используется «use», для глобальных - «global».

Например, вы также не можете напрямую использовать глобальную переменную:

$n = 5;

function f()
{
    echo $n; // Undefined variable
}

Вы должны использовать глобальное ключевое слово:

$n = 5;

function f()
{
    global $n;
    echo $n;
}
0 голосов
/ 28 апреля 2015

Вы можете использовать метод bindTo.

class MyClass {
  static function getHdvdsCol($pid) {
    $col = new PointColumn();
    $col->key = $pid;
    $parser = function($row) {
        print $this->key;
    };
    $col->parser = $parser->bindTo($parser, $parser);
    return $col;
  }
}

$func = MyClass::getHdvdsCol(45);
call_user_func($func, $row);
...