2009-06-15 36 views
27

Làm cách nào để tôi có được thứ như thế này để hoạt động?Làm thế nào tôi có thể gọi một phương thức tĩnh từ một lớp nếu tất cả những gì tôi có là một chuỗi tên lớp?

$class_name = 'ClassPeer'; 
$class_name::doSomething(); 
+3

$ class_name :: doSomething(); làm việc tốt cho tôi. – VolkerK

+0

@VolkerK, tôi gặp lỗi T_PAAMAYIM_NEKUDOTAYIM khi tôi thử. –

+1

@VolkerK: cú pháp đó hoạt động từ PHP 5.3 – Kornel

Trả lời

48

Tùy thuộc vào phiên bản của PHP:

call_user_func(array($class_name, 'doSomething')); 
call_user_func($class_name .'::doSomething'); // >5.2.3 
+0

Hoàn hảo. Tôi đang sử dụng ví dụ thứ hai ở trên để gọi phương thức tĩnh. Cảm ơn jimyi! –

+2

@jimyi, nhanh hơn? – Pacerier

+0

Tôi khá chắc chắn cái đầu tiên nhanh hơn vì nó tránh phân tích cú pháp chuỗi để truy xuất tên lớp và tên phương thức. Nhưng đó chỉ là một đoán, có lẽ khởi tạo mảng mất nhiều thời gian hơn phân tích chuỗi. – jurchiks

4

Phản ánh (PHP 5 hỗ trợ nó) là cách bạn thực hiện việc này. Đọc trang đó và bạn sẽ có thể tìm ra cách gọi hàm như thế.

$func = new ReflectionFunction('somefunction'); 
$func->invoke(); 

Documentation Link

9

Để phát huy sức mạnh của IDE autocomplete và phát hiện lỗi, sử dụng này:

$class_name = 'ClassPeer'; 

$r = new \ReflectionClass($class_name); 

// @param ClassPeer $instance 

$instance = $r->newInstanceWithoutConstructor(); 

//$class_name->doSomething(); 
$instance->doSomething(); 

Về cơ bản đây chúng ta đang gọi phương thức tĩnh trên một thể hiện của lớp.

+1

Nếu tôi có thể cung cấp cho bạn nhiều upvotes tôi sẽ. – josh123a123

0

Sau khi tôi gần như đã bỏ lỡ giải pháp đơn giản nhất từ ​​VolkerK, tôi đã quyết định mở rộng và đặt nó vào bài đăng. Đây là cách gọi các thành viên tĩnh trên lớp cá thể

// calling class static method 
$className = get_class($this); 
$result = $className::caluclate($arg1, $arg2); 

// using class static member 
foreach ($className::$fields as $field) { 
    : 
} 
Các vấn đề liên quan