2012-02-29 39 views
7

Đây là phiên bản đơn giản của những gì tôi muốn hoàn thành:Làm cách nào để thay đổi giá trị biến tĩnh trong PHP?

Trong tập lệnh của tôi, tôi muốn biến thay đổi đúng và sai mỗi khi tập lệnh được thực thi.

<?php 
    static $bool = true; 

    // Print differente messages depending on $bool 
    if($bool == true) 
     echo "It's true!"; 
    else 
     echo "It's false!"; 

    // Change $bools value 
    if($bool == true) 
     $bool = false 
    else 
     $bool = true; 
?> 

Nhưng rõ ràng những gì tôi đang làm là sai. Biến số $bool liên tục true và tôi chưa nắm bắt đầy đủ khái niệm về biến tĩnh mà tôi đoán. Tôi đang làm gì sai?

Trả lời

14

PHP không thể giữ giá trị biến giữa các yêu cầu. Điều này có nghĩa là mỗi khi tập lệnh của bạn được gọi, biến số $bool sẽ được đặt thành true. Nếu bạn muốn giữ giá trị giữa các yêu cầu bạn phải sử dụng sessions hoặc nếu bạn muốn biến được chia sẻ giữa các phiên, một số cơ chế lưu vào bộ nhớ cache như APC hoặc Memcache.

Ngoài ra, static được sử dụng trong PHP để khai báo biến được chia sẻ ở cấp lớp. Do đó, nó được sử dụng trong các lớp học và được truy cập như self::$variableName; hoặc Foo::$variableName

Bạn có thể đọc thêm về static properties here. Từ tài liệu:

Khai báo thuộc tính hoặc phương thức của lớp là tĩnh làm cho chúng có thể truy cập được mà không cần sự khởi tạo của lớp. Một thuộc tính được khai báo là tĩnh không thể được truy cập với một đối tượng lớp đã được khởi tạo (mặc dù một phương thức tĩnh có thể).

Ngoài ra, lưu ý rằng từ static đã quá tải từ PHP 5.3, và cũng có thể được sử dụng để biểu thị Late Static Binding, bằng cách sử dụng static::

+0

Hmm .. Vì vậy, nếu tôi di chuyển biến tĩnh vào một lớp, thì tôi có thể chuyển đổi giá trị của nó qua lại giữa các lần thực thi tập lệnh chính của tôi không? – Weblurk

+0

Không, hãy xem câu trả lời của tôi. – BenM

+4

Không. Tĩnh có thể được sử dụng để khai báo các biến lớp hoặc trong hàm để khai báo một biến tồn tại trên các cuộc gọi hàm, nhưng không được thực hiện trên các kịch bản lệnh. –

2

Giá trị tĩnh sẽ không tồn tại trong quá trình thực hiện. Mỗi lần kịch bản được thực hiện $ bool được khởi tạo. Tôi nghĩ bạn nên duy trì giá trị này trong một tệp để đơn giản.

+0

Tôi nghĩ rằng đó là điểm với các biến tĩnh, rằng chúng DO tồn tại lâu hơn các lần thực thi. Tôi không muốn giữ nó trong một tập tin riêng biệt hoặc là giải pháp duy nhất? – Weblurk

+0

Bạn có thể sử dụng Memcache, APC, Redis, một tập tin ... bất cứ điều gì bạn muốn. Nhưng bạn phải lưu trữ giá trị hiện tại của biến ở đâu đó. –

2

Tôi nghĩ rằng bạn cần phải hiểu rõ hơn về quan điểm của một biến tĩnh. Lưu trữ cho biến được cấp phát (và deallocated) trên ngăn xếp cuộc gọi, do đó, từ quan điểm kỹ thuật phần mềm, giá trị của nó không thể thay đổi trong thời gian chạy.

Có các giải pháp tốt hơn như được đề xuất ở trên cho việc này.

+1

Trên thực tế, các biến tĩnh trong PHP không tĩnh chút nào .. giá trị của chúng có thể thay đổi trong khi thực thi. Nó chỉ là một biến chia sẻ của một lớp. – PatrikAkerstrand

+0

Điều này cho phép mã như 'class Lookup {protected static $ _cache = array(); hàm publicLookup ($ x) {if (! isset (self :: $ _ cache [$ x]) {self :: $ _ cache [$ x] = $ this -> _ tra cứu ($ x);} return self :: $ _cache [$ x];}} ' – PatrikAkerstrand

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