Cho đến ngày hôm nay, tôi nghĩ rằng tôi đã nắm bắt khá tốt cách thức công cụ sửa đổi tĩnh hoạt động. Tôi biết rằng (trong thuật ngữ laymans) một biến tĩnh trong một hàm không 'đặt lại' qua các cuộc gọi đến hàm đó, và tôi biết rằng các biến tĩnh và các hàm trên một lớp có thể truy cập được bằng cách gọi chúng thông qua chính lớp đó của lớp).Biến PHP và tĩnh trong các hàm thành viên đối tượng
Vấn đề của tôi là thế này: hôm nay tôi phát hiện ra rằng nếu tôi khai báo một biến tĩnh bên của một tổ chức phi tĩnh chức năng vào một lớp học, tất cả sự khởi tạo của lớp chia sẻ mà biến tĩnh trong các cuộc gọi riêng biệt với chức năng thành viên .
Ví dụ:
class A {
public function GetValue() {
static $value = 0;
$value++;
return $value;
}
}
$instance_1 = new A();
$instance_2 = new A();
echo $instance_1->GetValue();
echo $instance_1->GetValue();
echo $instance_2->GetValue();
echo $instance_2->GetValue();
echo $instance_1->GetValue();
echo $instance_1->GetValue();
Chú ý rằng chức năng GetValue không phải là dự khai báo là tĩnh hoặc sử dụng một cách tĩnh (như trong, kêu gọi các tầng lớp chính nó).
Bây giờ, tôi luôn luôn giả định rằng điều này sẽ ra: 121234
Thay vào đó, tôi thấy rằng nó sẽ ra: 123456
Giống như tôi đã nói, tôi sẽ hiểu được điều này nếu $ giá trị biến tĩnh là bên trong một hàm tĩnh. Tuy nhiên, với nó nằm bên trong một hàm không tĩnh, tôi chỉ giả định rằng nó sẽ chỉ được 'gắn' với hàm 'bên trong' mỗi sự khởi tạo riêng lẻ.
Tôi đoán câu hỏi của tôi là gấp đôi, sau đó ... 1) đây có phải là lỗi hoặc hành vi dự kiến không? 2) làm các ngôn ngữ khác đối xử với các biến 'tĩnh bên trong không tĩnh' theo cùng một cách, hoặc là duy nhất này cho PHP?
Tôi đã xem một số câu hỏi về SO về hành vi của 'tĩnh' trong PHP. Có vẻ như đây là một khu vực thiếu tài liệu - dù về số lượng hay chất lượng. –
* (tham chiếu) * [biến tĩnh] (http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static) – Gordon
đó là hút. Tôi nghĩ "tĩnh" trong trường hợp này có nghĩa là biến sẽ không được đặt lại cho 'đối tượng' này, nhưng không phải cho 'lớp'. Một lần nữa hành vi chống trực quan. Và nếu trong các hành vi ngôn ngữ khác là như nhau - tất cả chúng chỉ là những kẻ ngu ngốc ngu ngốc. Phương thức này không tĩnh, vì vậy phương thức thuộc về cá thể đối tượng. Biến thuộc về phương thức, do đó biến sẽ chỉ thuộc về đối tượng, không phải lớp. Ahh ... –