2012-02-02 34 views
6
class example() 
{ 
    function shout($var) 
    { 
     echo 'shout'.$var; 
    } 

    function whisper($var, $bool) 
    { 
     if($bool) 
     { 
      echo $var; 
     } 
    } 
} 

$obj = new example(); 

if($var) 
{ 
    $func = $obj->shout(); 
}else 
{ 
    $func = $obj->whisper(); 
} 

Tôi muốn chuẩn bị biến chức năng đầu tiên để sử dụng sau này thay vì đặt điều kiện trong vòng lặp. Có cách nào để làm điều đó không?Làm thế nào để gán một hàm đối tượng cho một biến?

+0

Cẩn thận với những lập luận trên thì thầm/hét/etc. Bạn đang chơi với lửa quacks-like-a-duck. – landons

+0

@landons Tôi không thấy làm thế nào có bất kỳ "quacks-like-a-duck" lửa, xem xét nó (PHP) là tất cả các kiểu động anyway ... –

+0

@landons thực sự? tôi thậm chí không nhận thấy nó hehe – kaz

Trả lời

4

Bạn có thể đặt tên hàm trong một chuỗi:

if($var) 
{ 
    $func = 'shout'; 
}else 
{ 
    $func = 'whisper'; 
} 

Sau đó:

$obj->$func 

Bạn có thể cũng sử dụng gọi lại:

if($var) 
{ 
    $func = array($obj, 'shout'); 
}else 
{ 
    $func = array($obj, 'whisper'); 
} 

Sau đó:

call_user_func($func); 

hay:

call_user_func_array($func, $args); 
+0

@notJim, cái nào được khuyến khích sử dụng nhiều hơn? – kaz

+0

@pst: Đây là một cuộc gọi lại theo [hướng dẫn sử dụng php] (http://php.net/manual/en/language.pseudo-types.php). @ kaz: Tôi cũng không có ý kiến ​​mạnh mẽ. Tôi thường sử dụng '$ obj -> $ func', trừ khi tôi cần truyền nó cho các chức năng khác. – notJim

+0

@notJim Đó là một chút của lưỡi-trong-cheak về phía tôi: Tôi đoán tôi nên thay vì nhấn mạnh rằng nó (cách tiếp cận thứ hai) là "một tuple thông tin để gọi một phương pháp theo tên" và không phải là một lớp học đầu tiên giá trị (hoặc hàm gọi lại) :) –

6

Bạn có thể gọi các phương thức theo tên:

if ($var) { 
    $fn = 'shout'; 
} else { 
    $fn = 'whisper'; 
} 

$obj->$fn(); 
+3

Có (+1) bạn có thể, nhưng về mặt kỹ thuật không phải là câu hỏi đang hỏi :-) Trong Ruby và Python nó là có thể nhận được "các phương thức liên kết" (các hàm kết hợp với một ngữ cảnh đối tượng), trong khi C# có các nhóm phương thức có thể chuyển đổi thành các đại biểu (cũng được liên kết với một bối cảnh đối tượng trong trường hợp này). Có khái niệm nào như vậy với PHP không? (Nói, 5.3) –

+0

@pst tôi nghĩ rằng không có đối tác php của phương pháp ràng buộc - chúng tôi sẽ tìm kiếm nó. PHP thực sự là một ngôn ngữ cũ, chúng tôi chỉ may mắn vì nó linh hoạt mà các lập trình viên có thể làm số lượng công việc xung quanh. – kaz

+0

@pst: Không có. PHP không có đối tượng hàm _at all_ cho đến khi bản phát hành của PHP 5.3 - heck, 'create_function' vẫn trả về một gensym - và thậm chí với những người không có cách nào để có được một đối tượng hàm cho một hàm xác định của bất kỳ loại nào, hãy để một mình một phương pháp ràng buộc. – duskwuff

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