2016-02-03 1 views
0

Ниже приведена моя webhook класс, наряду с тестом, с этой ошибкой. Когда я echo из $this->callable_object выходы invoice, а когда я echo из $this->callable_method выходы created. По какой-то причине эта строка return $object->$this->callable_method($this->event->data); создает эту ошибку, и я не уверен, почему? Она должна быть такой же, как $invoice->created($args);PHP Уловимая фатальная ошибка: объект класса webhook не может быть преобразован в строку

CLASS + TEST

class webhook { 

    private $event; 
    private $callable_object; 
    private $callable_method; 

    private $types = array(
     'invoice.created', 
     'invoice.payment_failed', 
     'invoice.payment_succeeded', 
     'invoice.updated' 
    ); 

    public function __construct($event) { 
     $this->event = $event; 
     $this->valid(); 
     $this->parse(); 
    } 

    public function valid() { 
     if(!in_array($this->event->type, $this->types)) { 
      throw new Exception('unknown event'); 
     } 
    } 

    public function parse() { 
     $parts = explode('.', $this->event->type); 
     $this->callable_object = $parts[0]; 
     $this->callable_method = $parts[1]; 
    } 

    public function get_event_type() { 
     return $this->event->type; 
    } 

    public function get_event_data() { 
     return $this->event->data; 
    } 

    public function get_callable_object() { 
     return $this->callable_object; 
    } 

    public function get_callable_method() { 
     return $this->callable_method; 
    } 

    public function execute() { 
     $object = new $this->callable_object(); 
     return $object->$this->callable_method($this->event->data); 
    } 

} 

$event['type'] = 'invoice.created'; 
$webhook = new webhook((object)$event); 
$webhook->execute(); 
+0

Этот '$ object -> $ this-> callable_method ($ this-> event-> data);' определенно проанализирован как-то не то, что вы ожидаете. Попробуйте '$ object -> {$ this-> callable_method} ($ this-> event-> data);' –

ответ

2

Телль PHP как разобрать построить так:

$object->$this->callable_method($this->event->data); 

Изменить на:

$object->{$this->callable_method}($this->event->data); 
+0

Пригвожден, спасибо! – Naterade

2

u_mulder прав в своем решении, но слишком объяснять ...

Вот что у вас есть на данный момент: $object->$this->callable_method($this->event->data);

PHP попытается рекурсию вниз свойства callable_method, что означает, что он ищет свойства $this на $object, и так $this не могут быть преобразованы к строке вы получите сообщение об ошибке.

Это в основном, как в математике, при условии, что следующий 1+1x1+1 результат будет 3, когда мы на самом деле означает (1+1)x(1+1), который был бы 4. Добавим скобки в математике добавить значение (не стреляйте в меня терминологию, вы получите идею)

Как и в математике, мы можем сделать то же самое с PHP, но мы используем фигурные скобки вместо

$object->{$this->callable_method}($this->event->data);

+0

Отличное объяснение Ли! Теперь имеет смысл. – Naterade