2011-12-16 32 views
5

có thể gán cho biến lớp một hàm trong thời gian chạy được thực hiện không? một loại "con trỏ hàm" như Ccó thể gán một hàm cho một biến lớp khi chạy trong php?

một cái gì đó như thế này: (điều này sẽ không làm việc vì tiền nằm ngoài phạm vi của A, nhưng đây là mô hình tôi có nghĩa)

class A { 
    public $function_name; 
    public functon run($arg1,$arg2){ 
     $function_name($arg1,$arg2); 
    } 
} 

function sum($a,$b){ 
    echo $a+$b; 
} 

$a=new A(); 
$a->function_name='sum'; 

$a->run();  

[sửa ] tôi biết có "call_user_func" nhưng nó cần như tôi hiểu để có chức năng trong phạm vi hoặc sử dụng một phương pháp public class

+0

bản sao có thể có của [Cách thêm phương thức mới vào đối tượng php khi đang di chuyển?] (Http://stackoverflow.com/questions/2938004/how-to-add-a-new-method-to-a -p-đối tượng-on-the-fly) – mario

Trả lời

3

Bạn có thể sử dụng một anonymous function nếu bạn sử dụng PHP> 5.3.0:

$sum = function($a, $b) { 
    return $a+$b; 
} 

$a->function_name = $sum; 
2

sử dụng call_user_func_array:

<?php 
class A { 

    public $function_name; 

    public function run($arg1,$arg2){ 

     return call_user_func_array($this->function_name, array($arg1, $arg2)); 

    } 
} 

function sum($a,$b){ 
    return $a+$b; 
} 

$a=new A(); 
$a->function_name= 'sum'; 

var_dump($a->run(1,1)); //2 

?> 
+0

Cool! nhưng tôi cần rằng khai báo hàm và khởi tạo lớp là trong cùng một phạm vi? – Zorb

+0

@ Zorb, ý bạn là gì, tổng hợp là một phương pháp công khai của lớp A? Bạn có thể chỉnh sửa câu hỏi ban đầu của bạn và đặt số tiền mà nó được cho là – Esailija

+0

Bạn đang sử dụng sai 'call_user_func_array()' ở đây ... nếu bạn biết các tham số bạn nên sử dụng 'call_user_func()', nếu không, bạn nên làm '$ args = func_get_args(); call_user_func_array ($ this-> function_name, $ args); 'thay vì tạo một mảng từ các tham số đã biết. – rdlowrey

1

Nó hoạt động bất kể phạm vi. Bạn chỉ cần gọi nó bằng cách sử dụng call_user_func. Tôi cũng đã sửa một vài lỗi chính tả trong ví dụ của bạn.

<?php 
    class A { 
     public $function_name; 
     public function run($arg1, $arg2) { 
     call_user_func($this->function_name, $arg1, $arg2); 
     } 
    } 

    function sum($a, $b){ 
     echo $a + $b; 
    } 

    $a = new A(); 
    $a->function_name = 'sum'; 

    $a->run(2, 3); 
?> 

Live example

0

Một cách khác là để tận dụng biến biến (áp dụng đối với đối tượng phương pháp)

public static function sum($arg1, $arg2) 
{ 
    .. 
} 

public function run($arg1, $arg2) 
{ 
    $func = $this->function_name; 
    $func($arg1, $arg2);   <-- procedural call 
    self::$func($arg1, $arg2); <-- static method call 
} 
0

Sử dụng bất kỳ biến thể nào của Callback p loại seudo. Sử dụng nó với call_user_func hoặc call_user_func_array

Hướng dẫn này cung cấp các ví dụ tuyệt vời về cách sử dụng ở trên.

Cũng xem phương thức php 5.4 Closure::bindTO mới nếu bạn muốn có thể dễ dàng sử dụng $ từ khóa này trong đó.

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