2011-12-11 42 views
24

Có thể xác định lại một hằng số trong php được xác định bởi hàm define không? Tôi có một lớp với một số hằng số chứa dữ liệu người dùng. Tôi đang cố gắng sử dụng lớp cho nhiều người dùng.Xác định lại các hằng số trong PHP

define('ALLEGRO_ID', 'id'); 
define('ALLEGRO_LOGIN', 'login'); 
define('ALLEGRO_PASSWORD', 'passwd'); 
define('ALLEGRO_KEY', 'key'); 
define('ALLEGRO_COUNTRY', 123); 

$allegro = new AllegroWebAPI();     
$allegro -> Login(); 

Tôi không viết lớp này, nhưng tôi đang sử dụng nó do hạn chế về thời gian. Tôi không biết tại sao tác giả của lớp này là dữ liệu người dùng thay vì sử dụng các biến trong cá thể.

Tôi biết rằng hằng số phải là hằng số (hiển nhiên!), Nhưng tôi đang tìm kiếm một mẹo để xác định lại chúng.

+9

Điều này nghe có vẻ giống như một điều gì đó cần được giải quyết theo cách khác tốt hơn về mặt kiến ​​trúc. –

+0

hằng số chứa dữ liệu người dùng nghe có vẻ lạ –

+9

Tiếp theo: 'define (4, 42);' – Zirak

Trả lời

53

Nếu bạn có các runkit extension cài đặt, bạn có thể sử dụng runkit_constant_redefine():

runkit_constant_redefine("name", "value"); 

Trong hầu hết các trường hợp, tuy nhiên, nó sẽ là một ý tưởng tốt hơn để đánh giá lại lý do tại sao bạn đang sử dụng hằng số và không phải là một cái gì đó phù hợp hơn.

+1

Ngoài ra còn có phần mở rộng PHP [uopz] (http://php.net/manual/en/book.uopz.php) có chức năng tương tự: [uopz_redefine] (http : //php.net/runkit_constant_redefine). 'uopz_redefine()' cho phép một định nghĩa lại các hằng của lớp. – matt

20

Không, bạn không thể xác định lại hằng số (trừ runkit_constant_redefine),
đó là lý do tại sao được gọi là CONSTANT.

gì bạn đang tìm kiếm trong lớp thực sự là một biến đối tượng trong định dạng mảng: -

class user 
{ 
    public $user = array(); 

    function load($user_id) 
    { 
    // etc 
    $this->$user[$user_id] = something_else; 
    } 
} 
+7

Nói cách khác, câu trả lời là 'Có'. – DaveWalley

+1

Câu trả lời ngắn: Không. Câu trả lời dài: Có. Câu trả lời dài hơn: runkit_constant_redefine. – Cullub

+2

Câu trả lời ngắn: Bạn không nên. Câu trả lời dài: Bạn có thể, nhưng bạn vẫn không nên. Câu trả lời dài hơn: Bạn có thể với hack này, nhưng bạn vẫn thực sự không nên. Những gì bạn đang tìm kiếm là một hằng số không thay đổi liên tục;) – Edward

2

Giá trị hằng số khi được xác định vẫn không thay đổi trong suốt chương trình. Nếu bạn có yêu cầu như vậy, nơi bạn muốn thay đổi các giá trị trong tương lai thì hãy giữ các giá trị như vậy trong các biến PHP.

0

Trong PHP 5.6+, bạn có thể nhập các hằng số, dưới bí danh. Bí danh như vậy có thể ghi đè lên một hằng số đã tồn tại.

Đoạn sau đây sẽ in int(5):

define('ALLEGRO_ID', 3); 
define('NEW_ALLEGRO_ID', 5); 
use NEW_ALLEGRO_ID as ALLEGRO_ID; 
var_dump(ALLEGRO_ID); 

cơ chế như vậy có thể là hợp pháp trong bài kiểm tra đơn vị, hoặc các khu vực khác, nơi mà hành vi kỳ diệu được dung nạp tốt, nhưng không phải là thuận tiện đối với trường hợp sử dụng của bạn, nơi một lớp học để lưu trữ cài đặt người dùng của bạn sẽ hữu ích hơn.

Cuối cùng, hành vi này cho phép tạo các tình huống rất khó hiểu như use const true as false;.

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