2014-12-26 2 views
3

Как назначить функцию методу в классе PHP? Я попытался следующие:PHP: назначить функцию методу класса

class Something{ 
    public function __construct(){ 
     $functionNames = array('foo', 'bar') 

     $variable = 'blablabla'; 

     foreach($functionNames as $functionName){ 
      if(method_exists($this, $functionName)) 
       continue; 

      $this->{$functionName}() = function($params){ //should create the methods "foo" and "bar" 
       echo $variable; //should echo 'blablabla' (I know that the variable was declared outside this function, but how can I access it anyway?) 
      }; //the error points to here 
     } 
    } 
} 

Но этот код дает мне эту ошибку:

Fatal error: Can't use method return value in write context 

Кто-нибудь знает, как я могу назначить анонимную функцию метода класса, в то же время еще в состоянии получить доступ к переменным вне этой функции?

+1

Я не думаю, что это возможно в PHP в том, что вы делаете это. Я думаю, вам нужно создать экземпляр объекта или вернуть функцию, которая присваивает что-то переменной. Не плохой вопрос. –

+0

Вы не можете вернуться в конструктор класса. Это вызовет ошибку. http://php.net/manual/en/language.oop5.decon.php – versalle88

+0

@ versalle88 да, это правда ... У меня на самом деле есть цикл foreach, а 'return;' - 'continue;', но я решил немного упростить код, поскольку (я думал) это не было необходимо. Я отредактирую его, хотя – Jonan

ответ

3

Вы делаете foreach($functionNames as $functionName){, что означает, что $functionName является строкой , а не массивом. Поэтому не используйте $functionName[0].

method_exists принимает 2 параметра. Один - это объект, а другой - имя метода. Оно должно быть:

method_exists($this, $functionName) 

Что касается создания функции, вам не нужно () на оставил сторону =. Оно должно быть:

$this->$functionName = function($params) use($variable){ 
    echo $variable; 
}; 

The use($variable) необходимо сказать PHP, чтобы использовать эту переменную внутри функции. Вот как работают замыкания на PHP, он отличается от других языков.

Итак, ваш класс должен выглядеть следующим образом:

class Something{ 
    public function __construct(){ 
     $functionNames = array('foo', 'bar'); 

     $variable = 'blablabla'; 

     foreach($functionNames as $functionName){ 
      if(method_exists($this, $functionName)){ 
       continue; 
      } 

      $this->$functionName = function($params) use($variable){ 
       echo $variable; 
      }; 
     } 
    } 
} 

Проблема здесь в том, что таким образом сделать функции, вы на самом деле не создает метод класса, но вместо того, чтобы создать переменную класса, который содержит функцию.

Таким образом, вы должны назвать его так:

$test = new Something; 
$foo = $test->foo; 

$foo('abc'); 

Вы не можете просто сделать $test->foo('abc');.

EDIT: Другое, что вы можете сделать, это использовать «магический метод» PHP __call. Это будет выполняться всякий раз, когда вы делаете ->funcName(), независимо от того, существует ли метод или нет. Используя этот метод, вы можете просто проверить, был ли метод вызван 'foo' или 'bar'. Смотрите пример:

class Something{ 
    private $variable; 

    public function __construct(){ 
     $this->variable = 'blablabla'; 
    } 

    public function __call($name, $params=array()){ 
     if(method_exists($this, $name)){ 
      // This makes sure methods that *do* exist continue to work 
      return call_user_func(array($this, $name), $params); 
     } 
     else{ 
      $functionNames = array('foo', 'bar'); 

      if(in_array($name, $functionNames)){ 
       // You called ->foo() or ->bar(), so do something 
       // If you'd like you can call another method in the class 
       echo $this->variable; 
      } 
     } 
    } 
} 

С этим, теперь вы можете сделать следующее:

$test = new Something; 
$test->foo('abc'); // Will echo "blablabla" 
+1

Спасибо большое! Метод '__call' работал для меня. – Jonan

+0

Добро пожаловать! :-) –

Смежные вопросы