2010-02-24 50 views
7

Tôi muốn xác định hằng số lớp bằng cách ghép nối một hằng số hiện tại và một chuỗi. Tôi không thể xác định trước nó bởi vì chỉ vô hướng được phép cho các hằng số định trước, vì vậy tôi hiện có nó như là một phần của hàm tạo của tôi với hàm được định nghĩa() kiểm tra nếu nó đã được định nghĩa chưa. Giải pháp này hoạt động nhưng hằng số của tôi bây giờ không cần thiết toàn cầu.Xác định hằng số lớp trong PHP

Có cách nào để xác định một hằng số lớp tại thời gian chạy trong php không?

Cảm ơn bạn.

Trả lời

9

Xem PHP manual on Class constants

Giá trị phải là một biểu thức hằng số, không (ví dụ) một biến, một tài sản, kết quả của một phép toán, hay một lời gọi hàm.

Nói cách khác, điều đó là không thể. Bạn có thể làm điều đó với runkit_constant_add nhưng loại bản vá khỉ này không được khuyến khích mạnh mẽ.

+3

Cân nhắc sử dụng biến tĩnh. http://php.net/manual/en/language.oop5.static.php – Matchu

+1

đang sử dụng define() được coi là vá lỗi khỉ? là có một lý do tại sao xác định hằng số toàn cầu tại thời gian chạy là chấp nhận được trong khi xác định hằng số lớp học không? – joshs

+0

@josh Sử dụng define() * như vậy * không được coi là vá khỉ. Bạn phải có một cơ chế để xác định các hằng số và về mặt kỹ thuật, điều này luôn xảy ra khi chạy. Tuy nhiên, ý tưởng về hằng số như vậy là cung cấp giá trị * * * cố định trên toàn cầu, đó là lý do tại sao bạn thường khai báo các hằng số trên đầu trang của tập lệnh của bạn. Làm như vậy sau đó hoặc dựa trên một số điều kiện tôi sẽ xem xét sử dụng sai bởi vì sau đó bạn đang sử dụng hằng số như biến và trong trường hợp hoặc xác định lại hoặc xóa chúng, tôi sẽ coi nó là khỉ xấu, vì nó thay đổi hành vi bên trong của PHP. – Gordon

3

Một tùy chọn khác là sử dụng các phương pháp ma thuật __get() và __set() để từ chối các thay đổi đối với các biến nhất định. Đây không phải là hằng số như một biến chỉ đọc (từ quan điểm của các lớp khác). Một cái gì đó như thế này:

// Completely untested, just an idea 
// inspired in part from the Zend_Config class in Zend Framework 
class Foobar { 

    private $myconstant; 

    public function __construct($val) { 
     $this->myconstant = $val; 
    } 

    public function __get($name) { 
     // this will expose any private variables 
     // you may want to only allow certain ones to be exposed 
     return $this->$name; 
    } 

    public function __set($name) { 
     throw new Excpetion("Can't set read-only property"); 
    } 
} 
3

Bạn không thể làm chính xác những gì bạn muốn làm, theo Gordon's answer. Tuy nhiên, bạn có thể làm một cái gì đó như thế này. Bạn chỉ có thể đặt một lần:

class MyClass 
{ 
    private static $myFakeConst; 

    public getMyFakeConst() 
    { 
     return self::$myFakeConst; 
    } 

    public setMyFakeConst($val) 
    { 
     if (!is_null(self::$myFakeConst)) 
      throw new Exception('Cannot change the value of myFakeConst.'); 

     self::$myFakeConst = $val; 
    } 
} 
Các vấn đề liên quan