Подтвердить что ты не робот

Как я могу получить доступ к константам класса, используя `self::` внутри анонимной функции, определенной в методе?

Я хотел бы получить доступ к константе класса с помощью self из анонимной функции.

class My_Class {    
    const  CLASS_CONSTANT = 'test value';
    private function my_function(){     
        $lambda_function = function(){
            echo self::CLASS_CONSTANT;
        };
        $lambda_function();
    }
}

Когда я попробовал это, я получаю сообщение об ошибке:

Неустранимая ошибка: не удается получить доступ к самому себе: когда класс класса не активен в...

Можно ли передать родительский класс в область этой анонимной функции? Будет ли выполняться оператор use?

4b9b3361

Ответ 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'