Ответ 1
Вам нужно указать, какие переменные должны быть закрыты таким образом:
function($row) use ($pid) { ... }
Очевидно, что $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;
}