Как я могу получить доступ к константам класса, используя `self::` внутри анонимной функции, определенной в методе?
Я хотел бы получить доступ к константе класса с помощью self
из анонимной функции.
class My_Class {
const CLASS_CONSTANT = 'test value';
private function my_function(){
$lambda_function = function(){
echo self::CLASS_CONSTANT;
};
$lambda_function();
}
}
Когда я попробовал это, я получаю сообщение об ошибке:
Неустранимая ошибка: не удается получить доступ к самому себе: когда класс класса не активен в...
Можно ли передать родительский класс в область этой анонимной функции? Будет ли выполняться оператор use
?
Ответы
Ответ 1
→ Все версии теста PHP 5.4+ на 3v4l <
PHP 5.4+ WAY:
Это стало значительно проще, поскольку PHP 5.4, где $this
больше не загрязнен:
class My_Class {
const CLASS_CONSTANT = 'test value';
private function my_function() {
$lambda_function = function() {
// $this is actually inherited from the parent object, so
// you don't even need a use() statement
echo $this::CLASS_CONSTANT;
// Or just use self, that inherited too
echo self::CLASS_CONSTANT;
};
$lambda_function();
}
}
PRE 5.4 WAY:
Сделать анонимную функцию закрытием - путем ввода переменных в функцию - и вызвать константу из этого:
class My_Class {
const CLASS_CONSTANT = 'test value';
private function my_function() {
$self = $this;
$lambda_function = function() use ($self) { // now it a closure
echo $self::CLASS_CONSTANT;
} // << you forgot a ;
lambda_function(); // << you forgot a $
}
}
К сожалению, вы не можете use ($this)
YET. Они работают над этим. Я ожидаю, что он будет работать в PHP >= 5.4.
Ответ 2
анонимные функции afaik - это просто функции. Не классные методы, поэтому область действия отсутствует. Вы можете передать константу в качестве аргумента или использовать My_Class:: CLASS_CONSTANT.
Ответ 3
Вы получаете доступ к себе внутри анонимной функции, это не сработает. Что вам нужно сделать, это использовать My_Class::CLASS_CONSTANT
вместо самостоятельной ссылки.
Ответ 4
Нет, это невозможно. Аналогично, вы не можете привязать $this к анонимной функции. Просто передача необходимых значений вместо этого должна сделать трюк?
<?php
class My_Class {
const CLASS_CONSTANT = 'test value';
private function my_function(){
$lambda = function( $yourConstant ){
return $yourConstant;
};
return $lambda( self::CLASS_CONSTANT );
}
public function test( ) {
return $this->my_function( );
}
}
$class = new My_Class( );
echo $class->test( ); // 'test value'