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

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

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

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

Неустранимая ошибка: Невозможно получить доступ к self ::, если в классе нет активной области действия ...

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

Ответы [ 4 ]

12 голосов
/ 24 ноября 2011

>> Тест всех версий PHP 5.4+ на 3v4l << </a>

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's 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's a closure
            echo $self::CLASS_CONSTANT;
        } // << you forgot a ;
        lambda_function(); // << you forgot a $
    }
}

К сожалению, вы не можете use ($this) YET.Они работают над этим.Я ожидаю, что это будет работать в PHP> = 5.4.

8 голосов
/ 23 ноября 2011

afaik анонимные функции это просто .. функции.Не классовые методы, поэтому область действия отсутствует.Вы можете передать константу в качестве аргумента или использовать My_Class :: CLASS_CONSTANT.

1 голос
/ 23 ноября 2011

Нет, это невозможно. Точно так же вы не можете привязать $ 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'
1 голос
/ 23 ноября 2011

Вы получаете доступ к себе внутри анонимной функции, это не будет работать. Вам следует использовать My_Class::CLASS_CONSTANT вместо ссылки на себя.

...