2009-07-20 37 views
29

Tôi muốn kiểm tra là một hàm có trong thư viện mà tôi đang tạo hay không. Tôi đã thấy hàm và method_exists, nhưng chưa tìm được cách cho phép tôi gọi chúng trong một ngữ cảnh tương đối. Dưới đây là ví dụ tốt hơn:Tìm hiểu xem phương thức có tồn tại trong một lớp tĩnh

class myClass{ 
    function test1() 
    { 
     if(method_exists("myClass", "test1")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test2() 
    { 
     if(method_exists($this, "test2")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test3() 
    { 
     if(method_exists(self, "test3")) 
     { 
      echo "Hi"; 
     } 
    } 
} 
// Echos Hi 
myClass::test1(); 
// Trys to use 'self' as a string instead of a constant 
myClass::test3(); 
// Echos Hi 
$obj = new myClass; 
$obj->test2(); 

Tôi cần có khả năng tạo âm thanh thử nghiệm 3 Xin chào nếu chức năng này tồn tại mà không cần đưa ra khỏi ngữ cảnh tĩnh. Do từ khóa để truy cập vào lớp nên là 'self', vì $ này là dành cho các lớp được gán.

+0

Tại sao phương pháp test1() không đủ? – gapple

+0

Bởi vì tôi muốn đưa điều này vào một lớp học sẽ được mở rộng bởi nhiều lớp học. Tôi có thể sử dụng một hằng số phép thuật để đạt được điều này, nhưng phải có một cách dễ dàng hơn. –

Trả lời

49

get_called_class() đã được giới thiệu trong PHP 5.3, và sẽ trở lại với "Late Binding tĩnh" tên lớp:

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_called_class(), "test")) 
     { 
       echo get_called_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // should print "subClass::test()" 

Các get_class() chức năng, mà là của php 5.0.0 không đòi hỏi bất kỳ tham số nào nếu được gọi trong một lớp sẽ trả về tên của lớp trong đó hàm được khai báo (ví dụ: lớp cha):

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_class(), "test")) 
     { 
       echo get_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 

Các __CLASS__ magic constant không giống nhau [link].

class myClass{ 
    public static function test() 
    { 
     if(method_exists(__CLASS__, "test")) 
     { 
       echo __CLASS__.'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 
+0

Cảm ơn bạn! Đó là chính xác những gì tôi đang tìm kiếm. –

+0

Tôi đang tìm cách kiểm tra xem một phương thức tĩnh tồn tại trên lớp cha và câu trả lời này đã dẫn tôi khám phá ra rằng 'get_parent_class()' hoạt động giống như khi được gọi mà không có bất kỳ tham số nào. Cảm ơn! – mopo922

1

Cập nhật:

Ahh, xin lỗi. Tôi đã tạm thời bị mù :) Bạn sẽ muốn sử dụng hằng số phép thuật __CLASS__

ví dụ:

if (method_exists(__CLASS__, "test3")) { echo "Hi"; } 
+0

câu trả lời này có vẻ giống như phương pháp test1() của ví dụ câu hỏi bằng cách sử dụng method_exists() với tên lớp được chuyển thành chuỗi – gapple

+0

Ý tưởng là tôi không cần tên lớp và do đó tôi có thể đặt phương thức bất kỳ lớp nào, và nó sẽ hoạt động, cho dù lớp đã được gán hay chưa. –

+0

Ý bạn là từ những nhận xét mà tôi 'vừa' đặt vào câu hỏi chính? –

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