Chúng ta có thể thay đổi giá trị biến tĩnh trong php không?

Phạm vi có thể được định nghĩa là phạm vi khả dụng của một biến đối với chương trình mà nó được khai báo. Các biến PHP có thể là một trong bốn loại phạm vi -

  • Biến cục bộ
  • thông số chức năng
  • biến toàn cầu
  • biến tĩnh

Loại phạm vi biến cuối cùng mà tôi thảo luận được gọi là tĩnh. Ngược lại với các biến được khai báo là tham số của hàm, bị hủy khi hàm thoát, một biến tĩnh sẽ không mất giá trị khi hàm thoát và sẽ vẫn giữ giá trị đó nếu hàm được gọi lại

Bạn có thể khai báo một biến là tĩnh đơn giản bằng cách đặt từ khóa STATIC trước tên biến

Từ khóa static được sử dụng để khai báo các thuộc tính và phương thức của một lớp là tĩnh. Các thuộc tính và phương thức tĩnh có thể được sử dụng mà không cần tạo một thể hiện của lớp

Từ khóa static cũng được sử dụng để khai báo các biến trong hàm giữ nguyên giá trị của chúng sau khi hàm kết thúc

Một bản cập nhật kín đáo của PHP 8. 1 là nâng cấp hành vi biến tĩnh PHP trong các lớp. Biến tĩnh trong kế thừa phương thức. Hãy cùng xem lại các biến tĩnh trong PHP là gì, tại sao chúng lại có vấn đề cho đến nay và các chiến lược nâng cấp mã để loại bỏ vấn đề này

Biến tĩnh PHP

Mặc dù các thuộc tính và phương thức tĩnh khá được biết đến, nhưng các biến tĩnh lại là một bí mật. Họ trông như thế này trong mã

Trái ngược với các biến thông thường, biến tĩnh sẽ không chết khi kết thúc lệnh gọi hàm và vẫn tồn tại cho đến lần gọi tiếp theo. Đây là cách hàm trong ví dụ tiếp tục trả về $count sau khi tăng và mỗi lần nó hiển thị một giá trị khác nhau

Các biến tĩnh thuận tiện khi bạn cần giữ một số giá trị trong các cuộc gọi và giá trị này chỉ hữu ích cho chức năng này

Các biến tĩnh kế thừa

Các biến tĩnh có sẵn trong các phương thức, mặc dù trước đây chúng hoạt động khá bất ngờ. Chúng thực sự được tạo cho mỗi lớp từ nơi chúng được gọi. Chúng có thể kết thúc dưới dạng nhiều phiên bản, mặc dù, chúng chỉ được xác định một lần. Xem nó từ ví dụ này của Nikita Popov

Biến tĩnh được sử dụng trong các lớp A và B, nhưng phương thức này được kế thừa nên nó thực sự là cùng một mã được gọi. Cho đến PHP 8. 0, sẽ có một biến tĩnh riêng biệt tùy thuộc vào lớp nào được gọi

Điều này đã được sửa trong PHP 8. 1, trong đó hành vi bây giờ giống với thuộc tính tĩnh. các biến hiện được chia sẻ giữa các phương thức B::counter()A::counter và cả hai đều giống nhau

Lỗi này sẽ xảy ra khi một phương thức của một lớp được kế thừa bởi một phương thức khác và cũng sử dụng các biến tĩnh. Như chúng tôi đã đề cập ban đầu, điều này khá hiếm và việc gọi một phương thức tĩnh với các lớp khác nhau cũng khá hiếm, vì vậy đây có thể là một vấn đề khá hiếm gặp.

Điều đó có nghĩa là nó sẽ khá khó hiểu khi nó phát sinh. Vì vậy, có một quy tắc Exakat chuyên dụng được gọi là Biến tĩnh kế thừa để phát hiện chúng trong mã của bạn. Đây là một phần của Migration PHP 8. 1 bộ quy tắc

Nâng cấp biến tĩnh thành thuộc tính tĩnh

Một trong những ưu điểm chính của các biến tĩnh là chúng vô hình từ bên ngoài. Phương pháp hoạt động như một hộp đen từ bên ngoài

Điều này thường tốt trong phiên bản ban đầu của mã, cho đến khi nhu cầu xem chính giá trị xuất hiện. Sau đó, một người phụ thuộc vào chính phương thức đó để cung cấp cách truy cập nó, điều này không bao giờ thuận tiện

Vì vậy, một cách dễ dàng để nâng cấp một biến tĩnh là biến nó thành một thuộc tính. Thuộc tính hiện được lưu trữ bên ngoài phương thức và bên trong lớp nhưng có sẵn trên nhiều cuộc gọi. Nó cũng có sẵn cho pháp y bổ sung và chào mời, như với một getter đơn giản

i;
    }

    // this gets the counter, but do not increment it
    public function getI() {
        return $this->i;
    }
}
?>

Lưu ý rằng giải pháp này chuyển biến tĩnh thành thuộc tính bình thường. biến tĩnh thành thuộc tính tĩnh là có thể. Ở đây, nó sẽ chia sẻ bộ đếm trên TẤT CẢ các đối tượng, đây không phải là hiệu ứng mong muốn

Tiêm biến tĩnh

Một tùy chọn khác là di chuyển biến tĩnh dưới dạng tiêm và luôn cung cấp nó làm đối số cho phương thức. Về cơ bản, thay vì lưu trữ biến trong đối tượng hiện tại, giờ đây nó được lưu trữ trong ngữ cảnh gọi, ngữ cảnh này có trách nhiệm tạo và cung cấp biến đó mỗi lần

counter($i); // 1
echo $a->counter($i); // 2

?>

Ví dụ này vẫn là ví dụ truy cập ban đầu nên hơi đơn giản và cũng cần tham chiếu để tránh mất giá trị trong phương thức. Nó sẽ hoàn toàn khác với một đối tượng Counter

Sự bất tiện chính của phương pháp này là sự cần thiết của ngữ cảnh gọi (ở đây là toàn cầu) để duy trì đối tượng này cho đến khi hoàn thành

Một lỗi ít hơn trong mã của tôi

PHP8. 1 đã mang đến một danh sách khá hay về quá trình phát triển và sửa lỗi. các biến tĩnh kế thừa là một trong số chúng. Nó khá hiếm, nhưng cũng khá khó hiểu. Giải pháp thay thế cũng đủ đơn giản để bạn thực sự có thể chuẩn bị mã của mình bằng cách kiểm tra tính tương thích của nó với PHP 8. 1 với exakat, sau đó, quyết định cách thực hiện nâng cấp này. Ngay cả khi nâng cấp này không phải là bước tiếp theo của bạn, nó sẽ giúp mã an toàn hơn để nâng cấp sau này

Chúng ta có thể thay đổi giá trị của biến tĩnh không?

Nói một cách đơn giản, nếu bạn sử dụng một từ khóa tĩnh với một biến hoặc một phương thức bên trong một lớp, thì với mọi phiên bản mà bạn tạo cho lớp đó, các thành viên tĩnh này sẽ không đổi và you can't change or modify them.

Chúng ta có thể ghi đè biến tĩnh trong PHP không?

Cách đáng tin cậy để ghi đè một biến tĩnh là thực hiện bằng cách khai báo lại biến đó . Một số người có thể đề xuất sửa đổi nó trong phương thức xây dựng, nhưng tôi không nghĩ điều đó đáng tin cậy. Nó sẽ không phản ánh những thay đổi cho đến khi lớp được xây dựng ít nhất một lần.

Làm cách nào để thay đổi giá trị của một biến trong PHP?

Trong PHP, một biến không cần khai báo trước khi thêm giá trị cho nó. PHP tự động chuyển đổi biến thành kiểu dữ liệu chính xác, tùy thuộc vào giá trị của nó. Sau khi khai báo một biến, nó có thể được sử dụng lại trong toàn bộ mã. Toán tử gán ( = ) dùng để gán giá trị cho một biến .

Biến tĩnh có thể được định nghĩa lại không?

Các biến tĩnh có thể được xác định bên trong hoặc bên ngoài hàm . Chúng là cục bộ của khối. Giá trị mặc định của các biến tĩnh là 0. Các biến tĩnh vẫn tồn tại cho đến khi thực hiện chương trình.