2015-11-26 20 views
6

Vì vậy, method_exists() yêu cầu một đối tượng để xem liệu phương thức có tồn tại hay không. Nhưng tôi muốn biết nếu một phương thức tồn tại từ bên trong cùng một lớp.Kiểm tra xem phương thức có tồn tại trong cùng một lớp

Tôi có một phương thức xử lý một số thông tin và có thể nhận được một hành động, chạy một phương thức để xử lý thêm thông tin đó. Tôi muốn kiểm tra xem phương pháp tồn tại trước khi gọi nó. Làm thế nào tôi có thể đạt được nó?

Ví dụ:

class Foo{ 
    public function bar($info, $action = null){ 
     //Process Info 
     $this->$action(); 
    } 
} 
+0

Các câu trả lời dưới đây là tốt, chỉ cần một nhận xét bổ sung: bạn đã tự hỏi mình _why_ bạn cần phải tìm hiểu xem phương pháp tồn tại? Tình huống này _may_ phát sinh nếu bạn có một phương thức được kế thừa từ một lớp cha hoặc nếu bạn không chắc chắn về những gì lớp hiện tại kế thừa từ đó. Cả hai trường hợp đều có thể được xử lý bằng cách sử dụng một giao diện hoặc một định nghĩa phương thức trừu tượng. Đó là minh bạch hơn và di chuyển các lỗi từ thời gian chạy để biên dịch thời gian, do đó là thích hợp hơn. – arkascha

+0

Bởi vì tôi có một số phương thức khác được công khai và xử lý thông tin đó và trả về dữ liệu đã xử lý, phương thức đầu tiên không trả về, vì nó có thể nhận dữ liệu chỉ cần xử lý và không cần trả lại bất kỳ thứ gì. Nhưng tôi nghĩ nó sẽ tiết kiệm thời gian để gọi phương thức khác từ phương pháp fisrt nếu cần, nhưng vẫn có thể gọi chúng là tách biệt. – Rafael

+0

Nhưng bên trong bản thân lớp học, tại sao nó không được rõ ràng nếu một phương pháp tồn tại? Tôi có nghĩa là nó _is_ tuyên bố/thực hiện trong lớp hoặc nó không phải là. Làm thế nào và tại sao điều đó nên thay đổi khi chạy? Tôi muốn nói bạn biết chính xác nếu phương pháp tồn tại. – arkascha

Trả lời

21

Bạn có thể làm một cái gì đó như thế này:

class A{ 
    public function foo(){ 
     echo "foo"; 
    } 

    public function bar(){ 
     if(method_exists($this, 'foo')){ 
      echo "method exists"; 
     }else{ 
      echo "method does not exist"; 
     } 
    } 
} 

$obj = new A; 
$obj->bar(); 
2

method_exists() chấp nhận hoặc là một tên lớp hoặc đối tượng dụ như một tham số. Vì vậy, bạn có thể kiểm tra chống $this

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

thông số

đối tượng Một trường hợp đối tượng hoặc một tên lớp

method_name Tên phương pháp

+0

Tôi nghĩ rằng bạn đã cho tôi một liên kết đến hướng dẫn để hỗ trợ những gì bạn nói, nhưng trong hướng dẫn nó nói rằng nó cần một OBJECT. Tôi sẽ thử những gì bạn nói, quay lại sau một lúc ... – Rafael

+0

nêu bật phần thú vị ở trên cho bạn – Calimero

+0

Ow, (mặt đất), xin lỗi = p – Rafael

7

Sử dụng method_exists là đúng. Tuy nhiên nếu bạn muốn phù hợp với các "Giao diện Tách riêng Nguyên tắc", bạn sẽ tạo ra một giao diện để thực hiện mẫn chống lại, như vậy:

class A 
{ 
    public function doA() 
    { 
     if ($this instanceof X) { 
      $this->doX(); 
     } 

     // statement 
    } 
} 

interface X 
{ 
    public function doX(); 
} 

class B extends A implements X 
{ 
    public function doX() 
    { 
     // statement 
    } 
} 

$a = new A(); 
$a->doA(); 
// Does A::doA() only 

$b = new B(); 
$b->doA(); 
// Does B::doX(), then remainder of A::doA() 
+1

WTF ????? Tôi thấy rằng tôi vẫn còn rất nhiều điều để học xD – Rafael

+0

@Rafael Bạn không chỉ yêu OOP. – Flosculus

+2

Tôi đã bắt đầu, nhưng bạn đã giết nó @Flosculus – Rafael

1

Cách tốt nhất theo ý kiến ​​của tôi là sử dụng __call magic method.

public function __call($name, $arguments) 
{ 
    throw new Exception("Method {$name} is not supported."); 
} 

Có, bạn có thể sử dụng method_exists ($ this ...) nhưng đây là cách PHP nội bộ.

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