2012-02-21 23 views
7

Tôi có một chuỗi chứa tên lớp và tôi muốn nhận một hằng số và gọi phương thức (tĩnh) từ lớp đó.Lớp truy nhập hằng số và phương thức tĩnh từ chuỗi

<?php 
$myclass = 'b'; // My class I wish to use 

$x = new x($myclass); // Create an instance of x 
$response = $x->runMethod(); // Call "runMethod" which calls my desired method 

// This is my class I use to access the other classes 
class x { 
    private $myclass = NULL; 

    public function __construct ($myclass) { 
     if(is_string($myclass)) { 
      // Assuming the input has a valid class name 
      $this->myclass = $myclass; 
     } 
    } 

    public function runMethod() { 
     // Get the selected constant here 
     print $this->myclass::CONSTANT; 

     // Call the selected method here 
     return $this->myclass::method('input string'); 
    } 
} 


// These are my class(es) I want to access 
abstract class a { 
    const CONSTANT = 'this is my constant'; 

    public static function method ($str) { 
     return $str; 
    } 
} 

class b extends a { 
    const CONSTANT = 'this is my new constant'; 

    public static function method ($str) { 
     return 'this is my method, and this is my string: '. $str; 
    } 
} 
?> 

Như tôi đã dự kiến ​​(nhiều hơn hoặc ít hơn), sử dụng $variable::CONSTANT hoặc $variable::method(); không hoạt động.

Trước khi hỏi những gì tôi đã thử; Tôi đã thử rất nhiều thứ về cơ bản tôi quên.

Cách tiếp cận tốt nhất để làm điều này là gì? Cảm ơn trước.

Trả lời

22

Để truy cập vào liên tục, sử dụng constant():

constant($this->myClass.'::CONSTANT'); 

Xin lưu ý: Nếu bạn đang làm việc với không gian tên, bạn cần phải đặc biệt thêm namespace của bạn vào chuỗi thậm chí nếu bạn gọi constant() từ không gian tên tương tự !

Đối với các cuộc gọi, bạn sẽ phải sử dụng call_user_func():

call_user_func(array($this->myclass, 'method')); 

Tuy nhiên: đây là tất cả không phải là rất hiệu quả, vì vậy bạn có thể muốn xem xét thêm về thiết kế hệ thống phân cấp đối tượng của bạn. Có thể có cách tốt hơn để đạt được kết quả mong muốn, sử dụng thừa kế, v.v.

+0

Và những gì về phương pháp này? –

+0

Đã cập nhật câu trả lời! – Rijk

+0

Pow! Câu trả lời nhanh và dễ làm việc như một sự quyến rũ. Cảm ơn! –

1

Bạn có thể đạt được kết quả này bằng cách đặt biến tạm thời. Không phải là cách thanh lịch nhất nhưng nó hoạt động.

public function runMethod() { 
    // Temporary variable 
    $myclass = $this->myclass; 
    // Get the selected constant here 
    print $myclass::CONSTANT; 

    // Call the selected method here 
    return $myclass::method('input string'); 
} 

Tôi đoán đó là để làm với sự nhập nhằng của ::, ít nhất đó là những gì được thông báo lỗi được gợi ý tại (PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM)

+1

Tôi chỉ muốn viết câu trả lời giống hệt nhau.Đây sẽ là phiên bản "lành mạnh" nhất, tôi nghĩ vậy. Mặc dù viết lại hoàn toàn với thừa kế sẽ tốt hơn nhiều. – apfelbox

2

Sử dụng call_user_func để gọi phương thức tĩnh:

call_user_func(array($className, $methodName), $parameter); 
1

Các lớp được định nghĩa là trừu tượng có thể không được khởi tạo và bất kỳ lớp nào có chứa ít nhất một phương thức trừu tượng cũng phải là trừu tượng. Các phương thức được định nghĩa là trừu tượng chỉ đơn giản là khai báo chữ ký của phương thức - chúng không thể xác định việc thực hiện.

Khi kế thừa từ lớp trừu tượng, tất cả các phương thức được đánh dấu trừu tượng trong khai báo lớp của cha mẹ phải được xác định bởi con; Ngoài ra, các phương thức này phải được xác định với cùng một mức độ hiển thị (hoặc ít bị hạn chế hơn). Ví dụ: nếu phương thức trừu tượng được định nghĩa là được bảo vệ, việc triển khai hàm phải được định nghĩa là được bảo vệ hoặc công khai, nhưng không được đặt ở chế độ riêng tư. Hơn nữa chữ ký của các phương thức phải khớp với nhau, tức là các gợi ý kiểu và số đối số bắt buộc phải giống nhau. Điều này cũng áp dụng cho các nhà xây dựng như của PHP 5.4. Trước khi chữ ký của hàm tạo 5.4 có thể khác nhau. Tham khảo http://php.net/manual/en/language.oop5.abstract.php

0

trong php 7 bạn có thể sử dụng mã này

echo 'my class name'::$b; 
+1

Trong khi câu trả lời này có thể giải quyết vấn đề của OP, bạn nên cung cấp một giải thích rõ ràng về cách thức này đạt được giải pháp. Chỉ cần đăng câu trả lời chỉ có mã có thể không hữu ích cho người dùng OP và người dùng trong tương lai. Xin hãy giải thích. Giải pháp –

+1

rất rõ ràng! vì tiêu đề của câu hỏi là ** Truy cập lớp không đổi và phương thức tĩnh từ chuỗi ** –

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