Проблема с закрытием PHP

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

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

Итак, как можно получить доступ к $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). Однако я чувствую, что это уродливо.

Ответ 1

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

function($row) use ($pid) { ... }

Ответ 2

Вы можете использовать метод 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);

Ответ 3

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

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

$n = 5;

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

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

$n = 5;

function f()
{
    global $n;
    echo $n;
}