2010-08-02 31 views
27

Tôi mong đợi những điều sau đây hoạt động nhưng dường như không có.Bạn có thể sử dụng hằng số tĩnh trong PHP không?

<?php 

class Patterns 
{ 
    public static const EMAIL = "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix"; 
    public static const INT = "/^\d+$/"; 
    public static const USERNAME = "/^\w+$/"; 
} 

tôi nhận được syntax error, unexpected T_CONST, expecting T_VARIABLE

Trả lời

66

Bạn có thể sử dụng const trong lớp như thế này:

class Patterns { 
    const EMAIL = "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix"; 
    const INT = "/^\d+$/"; 
    const USERNAME = "/^\w+$/"; 
} 

Và có thể truy cập USERNAME const như thế này:

Patterns::USERNAME 
+1

Khi một const của nó, nó sẽ được xử lý như là tĩnh nội bộ của trình biên dịch PHP tôi tin rằng vì giá trị của nó không thể thay đổi. –

+1

nhưng giá trị của 'biến tĩnh' có thể thay đổi theo cách chúng được xử lý giống như' static' vì chúng không thể thay đổi hoàn toàn nhưng có thể thay đổi nếu nó phụ thuộc vào biến toàn cầu và 'biến toàn cầu' thay đổi trước' instance' của 'class' được tạo ra –

6

hằng lớp Nope không thể được gắn nhãn tĩnh cũng không gán tầm nhìn.

http://php.net/manual/en/language.oop5.static.php

+0

Cách thay thế tốt nhất theo ý kiến ​​của bạn. Nếu bạn phải viết lớp ví dụ theo cách có thể chấp nhận được trong PHP - bạn sẽ làm như thế nào? Cảm ơn! –

+0

@Emanuil: sau đó anh ta sẽ xóa các từ khóa "công khai" và "tĩnh" ;-) – zerkms

+0

@Sarfraz: Tôi muốn có một lớp chứa một bộ sưu tập các cụm từ thông dụng thường dùng mà tất cả các ứng dụng của tôi có thể sử dụng. –

0

Bạn đang cố truy cập các hằng số như thế nào?

Tôi tin rằng điều này sẽ làm việc:

echo Patterns::$EMAIL; //shows "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-...." 

Nếu bạn chỉ cần khai báo nó như là tĩnh.

+3

nó không phải là một hằng số trong mẫu của bạn, mà là một biến tĩnh. – zerkms

+0

@zerkms đó là lý do tại sao tôi nói nếu bạn chỉ tuyên bố nó là tĩnh @mattbasta không phải là những gì anh ta muốn? – Chris

+0

bạn có thể xem những gì anh ta muốn ở câu trả lời đã chọn. – zerkms

7

Chúng không phải hằng số tĩnh, chỉ cần hằng

class Patterns 
{ 
    const EMAIL = "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix"; 
    const INT = "/^\d+$/"; 
    const USERNAME = "/^\w+$/"; 
} 

echo Patterns::EMAIL; 
26

Trong PHP , tĩnh và const là hai thứ khác nhau.

const biểu thị hằng số lớp. Chúng khác với các biến thông thường vì chúng không có '$' ở trước chúng và không thể có bất kỳ công cụ sửa đổi hiển thị nào (công khai, được bảo vệ, riêng tư) trước chúng. Cú pháp của chúng:

class Test 
{ 
    const INT = "/^\d+$/"; 
} 

Bởi vì chúng không đổi, chúng không thay đổi.

Tĩnh biểu thị dữ liệu được chia sẻ giữa các đối tượng của cùng một lớp. Dữ liệu này có thể được sửa đổi. Ví dụ sẽ là một lớp học theo dõi số lượng phiên bản được phát tại một thời điểm:

class HowMany 
{ 
    private static $count = 0; 

    public function __construct() 
    { 
     self::$count++; 
    } 

    public function getCount() 
    { 
     return self::$count; 
    } 

    public function __destruct() 
    { 
     self::$count--; 
    } 
} 

$obj1 = new HowMany(); 
$obj2 = new HowMany(); 

echo $obj1->getCount(); 

unset($obj2); 

echo $obj1->getCount(); 
+0

Kể từ PHP 7.1.0 [hằng số lớp có thể có các công cụ sửa đổi hiển thị] (https://secure.php.net/manual/en/language.oop5.constants.php#language.oop5. basic.class.this). – totymedli

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