2015-10-18 3 views
1

У меня есть метод, который принимает имя метода в параметре и возвращает этот метод (из другого класса). Я не знаю, как вернуть этот метод, не выполняя его.Возврат метода без его выполнения

Вот некоторые пример кода с классом # 1:

public function hello() { 
    return "Hello World!"; 
} 

метод из класса # 2:

public function getPackageMethod($method) { 
    if (method_exists($this->package, $method)) { 
     return $this->package->$method; // This seems to return nothing 
    } 
} 

И я хотел бы получить в другом подлинника что-то вроде этого:

$obj = new Obj(); 
$hello = $obj->getPackageMethod('hello'); 
$hello(); // Calling the method here. But currently got a error that $hello is not a function 

Я думаю, что это можно сделать, но я думаю, что я что-то забыл. Спасибо.

ответ

0

Вы можете создать замыкание, а затем связать экземпляр вашего класса # 1 к закрытию :

class salutations { 
    public function hello() { 
     return "Hello World!"; 
    } 
} 

class methodFactory { 
    public function __construct($instance) { 
     $this->package = $instance; 
    } 

    public function getPackageMethod($method) { 
     if (method_exists($this->package, $method)) { 
      $f = function() use ($method) { return $this->package->{$method}(); }; 
      $f->bindTo($this); 
      return $f; 
     } 
    } 
} 

$salutationsInstance = new salutations(); 

$obj = new methodFactory($salutationsInstance); 
$hello = $obj->getPackageMethod('hello'); 
echo $hello(); 

Demo

+0

Выглядит отлично, спасибо Марк! – tbzr75

0

Когда вы возвращаете $this->package->$method, вы уже используете его как атрибут. Что вам нужно сделать, это сохранить этот метод и запустить его только тогда, когда захотите.

Было бы так:

private $method = null; 

public function setPackageMethod($method) 
{ 
    $this->method = $method; 
} 

public function runMethod() 
{ 
    return $this->package->{$this->method}(); 
} 

И вы можете использовать это сделать:

$obj->setPackageMethod('hello'); 
echo $obj->runMethod(); // The method only will be run now 
Смежные вопросы