2013-07-15 37 views
10

Có thể kiểm tra xem một phương thức đã bị ghi đè bởi lớp con trong PHP không?kiểm tra php nếu phương thức được ghi đè trong lớp con

<!-- language: lang-php --> 

class foo { 
    protected $url; 
    protected $name; 
    protected $id; 

    var $baz; 

    function __construct($name, $id, $url) { 
     $this->name = $name; 
     $this->id = $id; 
     $this->url = $url; 
    } 

    function createTable($data) { 
     // do default actions 
    } 
} 

lớp Child:

class bar extends foo { 
    public $goo; 

    public function createTable($data) { 
     // different code here 
    } 
} 

Khi lặp lại qua một mảng của các đối tượng được định nghĩa là các thành viên của lớp này, làm sao tôi có thể kiểm tra các đối tượng có phương pháp mới như trái ngược với cái cũ? Có chức năng như method_overridden(mixed $object, string $method name) không?

foreach ($objects as $ob) { 
    if (method_overridden($ob, "createTable")) { 
     // stuff that should only happen if this method is overridden 
    } 
    $ob->createTable($dataset); 
} 

Tôi nhận thức được template method pattern, nhưng chúng ta hãy nói rằng tôi muốn sự kiểm soát của chương trình để được tách biệt khỏi lớp và các phương pháp tự. Tôi sẽ cần một chức năng như method_overridden để thực hiện việc này.

+0

quá tải, hoặc ghi đè? Tôi nghĩ rằng PHP không có phương pháp quá tải –

+0

Tôi đã có nghĩa là over-ridden, có – Joey

+1

Bạn có thể thử điều này: http://www.php.net/manual/en/reflectionclass.hasmethod.php –

Trả lời

16

Kiểm tra xem lớp tuyên bố phù hợp với lớp học của đối tượng:

$reflector = new \ReflectionMethod($ob, 'createTable'); 
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob)); 
+0

Điều này chắc chắn là cách tôi muốn đi về nó, nhưng tôi có một câu hỏi: vì lý do gì là bạn sử dụng toán tử không gian tên trước ReflectionMethod? Là nó để đảm bảo rằng phương pháp đang được gọi từ không gian tên toàn cầu thay vì vô tình gọi một phương pháp cùng tên được định nghĩa trong một phạm vi địa phương hơn? – Joey

+3

Có thể không cần thiết trong trường hợp của bạn. Nếu đoạn mã trên nằm dưới một không gian tên, bạn sẽ cần phải nhập khẩu lớp ReflectionMethod, hoặc truy cập nó với tiền tố không gian tên chung ('\\'). Tôi chỉ đảm bảo tình huống này được xử lý :) –

2

Để nhận thông tin này, bạn phải sử dụng ReflectionClass. Bạn có thể thử getMethod và kiểm tra tên lớp của phương thức.

$class = new ReflectionClass($this); 
$method = $class->getMethod("yourMethod"); 
if ($method->class == 'classname') { 
    //.. do something 
} 

Nhưng xin lưu ý rằng phản chiếu đó không quá nhanh, vì vậy hãy cẩn thận với cách sử dụng.

+0

Trong PHP 5.5.20, '$ method ['class']' đã cho tôi: _Cannot sử dụng đối tượng kiểu ReflectionMethod là array_. '$ Method-> class' hoạt động tốt. –

+0

cảm ơn - Tôi đã thay đổi – Philipp