По-видимому, $ 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)
. Однако я чувствую, что это уродливо.
Вам нужно указать, какие переменные должны быть закрыты таким образом:
function($row) use ($pid) { ... }
Вы можете использовать метод 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);
Я думаю, что PHP очень согласован в области определения переменных. Правило: если переменная определена вне функции, вы должны указать ее явно. Для лексической области используется «использование», поскольку глобальные глобальные значения используются.
Например, вы также не можете использовать глобальную переменную напрямую:
$n = 5; function f() { echo $n; // Undefined variable }
Вы должны использовать глобальное ключевое слово:
$n = 5; function f() { global $n; echo $n; }