2010-06-15 27 views

Trả lời

3

tôi đã không kiểm tra này, nhưng là chức năng đúng method_exists:

http://php.net/manual/en/function.method-exists.php

+1

method_exists không làm việc với phụ huynh, nhờ mặc dù. Vì lý do nào đó, tôi nhớ đã nhận được hàm function_exists trước đây, nhưng hiện tại không phải là ... –

+5

Trong trường hợp đó, tôi không chắc bạn đang cố gắng làm gì. Có lẽ bạn có thể kết hợp nó với lớp get_parent - một cái gì đó như thế này: method_exists (get_parent_class ($ this), 'func') Tôi có thể sủa cây sai. – Mike

+0

Ah, điều đó thực sự hoạt động ... một lần. Nó cần phải lặp lại để đi bất kỳ cao hơn sau đó cha mẹ đầu tiên. –

0
<?php 
class super { 
    public function m() {} 
} 

class sub extends super { 
    public function m() { 
     $rc = new ReflectionClass(__CLASS__); 
     $namepc = $rc->getParentClass()->name; 
     return method_exists($namepc, __FUNCTION__); 
    } 
} 

$s = new sub; 
var_dump($s->m()); 

cho bool(true). Không chắc chắn nếu điều này sẽ làm việc nếu phương pháp đã được xác định trong một siêu lớp của super, nhưng nó sẽ là một vấn đề giới thiệu một vòng lặp đơn giản.

+0

Phương thức get_parent_class của Mike hoàn thành điều tương tự, không có Reflection. –

21
public function func() 
{ 
    if (is_callable('parent::func')) { 
     parent::func(); 
    } 
} 

Tôi sử dụng tính năng này để gọi hàm tạo mẹ nếu tồn tại, hoạt động tốt.

Tôi cũng sử dụng sau đây như một phiên bản generic:

public static function callParentMethod(
    $object, 
    $class, 
    $methodName, 
    array $args = [] 
) { 
    $parentClass = get_parent_class($class); 
    while ($parentClass) { 
     if (method_exists($parentClass, $methodName)) { 
      $parentMethod = new \ReflectionMethod($parentClass, $methodName); 
      return $parentMethod->invokeArgs($object, $args); 
     } 
     $parentClass = get_parent_class($parentClass); 
    } 
} 

sử dụng nó như thế này:

callParentMethod($this, __CLASS__, __FUNCTION__, func_get_args()); 
+1

'if (is_callable ('parent :: func')) parent :: func();' giải pháp là tuyệt vời, nếu C mở rộng B và B mở rộng A và C :: Foo kiểm tra cho cha mẹ :: Bar và Bar được khai báo trong A nhưng không phải trong B nó vẫn hoạt động như mong đợi. – Logikos

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