2012-11-13 51 views
12

Tôi chỉ chơi đùa với các chức năng call_user_func trong PHP và đang nhận được lỗi này khi chạy mã đơn giản này:call_user_func() dự kiến ​​tham số 1 là một callback hợp lệ

<?php 


class A 
{ 

    public $var; 
    private function printHi() 
    { 

     echo "Hello"; 

    } 

    public function __construct($string) 
    { 
     $this->var = $string; 


    } 

    public function foo() 
    { 

     call_user_func($this->var); 

    } 

} 

$a = new A('printHi'); 
$a->foo(); 


?> 

Tôi biết rằng nếu tôi làm một chức năng bên ngoài lớp được gọi là printHi, nó hoạt động tốt, nhưng tôi đề cập đến in của lớp hi và không chắc chắn lý do tại sao "này" không được đăng ký.

+1

'call_user_func_array (mảng ($ this, 'printHi'), mảng ($ arg1, $ arg2)); ' – GBD

Trả lời

22

$this->var được đánh giá là printHi trong ví dụ của bạn. Tuy nhiên, khi bạn đang gọi phương thức của một lớp, bạn cần chuyển hàm gọi lại dưới dạng mảng trong đó phần tử đầu tiên là đối tượng đối tượng và phần tử thứ hai là tên hàm:

call_user_func(array($this, $this->var)); 

Đây là tài liệu về callbacks hợp lệ: http://www.php.net/manual/en/language.types.callable.php

+1

thêm' bởi vì nó là phương thức trên' $ this', không phải là hàm toàn cục 'và tôi sẽ +1 –

+0

@BobFincheimer Xong! –

+0

Cảm ơn rất nhiều !! Điều đó đã giúp và nó hoạt động ngay bây giờ. – thed0ctor

1

Ngoài ra câu trả lời của Omar, bạn cũng có thể thực hiện một chức năng printHi() lớp tĩnh, vì vậy bạn có thể gọi nó là từ call_user_func('A::printHi'), như thế này:

class A 
{ 

    public $var; 
    public static function printHi() 
    { 

     echo "Hello"; 

    } 

    public function __construct($string) 
    { 
     $this->var = $string; 


    } 

    public function foo() 
    { 

     call_user_func($this->var); 

    } 

} 

$a = new A('A::printHi'); 
$a->foo(); 

Xem live example

+0

cảm ơn bạn đã phản hồi! Tôi sẽ giữ điều này trong tâm trí – thed0ctor

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