2011-07-21 25 views
6

thể trùng lặp:
Calling closure assigned to object property directlyAnonymous chức năng cho một phương pháp của một đối tượng

Tại sao điều này là không thể trong PHP? Tôi muốn để có thể tạo ra một chức năng trên bay cho một đối tượng cụ thể.

$a = 'a'; 
$tokenMapper->tokenJoinHistories = function($a) { 
    echo $a; 
}; 
$tokenMapper->tokenJoinHistories($a); 
+0

Lỗi bạn nhận được từ mã này là gì? – Nobody

Trả lời

0

Với $obj->foo() bạn gọi phương pháp này, nhưng bạn muốn gọi một tài sản như một hàm/phương pháp. Điều này chỉ gây nhầm lẫn cho trình phân tích cú pháp, bởi vì anh ta không tìm thấy một phương thức có tên là foo(), nhưng anh ta không thể mong đợi bất kỳ thuộc tính nào có thể gọi được.

call_user_func($tokenMapper->tokenJoinHistories, $a); 

Hoặc bạn mở rộng mapper của bạn như

class Bar { 
    public function __call ($name, $args) { 
    if (isset($this->$name) && is_callable($this->$name)) { 
     return call_user_func_array($this->$name, $args); 
    } else { 
     throw new Exception("Undefined method '$name'"); 
    } 
    } 
} 

(Có lẽ một số vấn đề trong ví dụ một cách nhanh chóng bằng văn bản này)

2

PHP cố gắng để phù hợp với một phương pháp dụ được gọi là "tokenJoinHistories" đó không phải là được xác định trong lớp gốc

Bạn phải làm thay vào đó

$anon_func = $tokenMapper->tokenJoinHistories; 
$anon_func($a); 

Đọc tài liệu here đặc biệt là phần nhận xét.

Các vấn đề liên quan