Tôi đã gặp một số hành vi không mong muốn với các biến tĩnh được xác định bên trong các phương thức đối tượng được chia sẻ trên các phiên bản. Đây có lẽ là hành vi đã biết, nhưng khi tôi duyệt tài liệu PHP, tôi không thể tìm thấy các cá thể của các biến được định nghĩa tĩnh trong các phương thức đối tượng.Tĩnh trong phương pháp không tĩnh được chia sẻ giữa các trường hợp
Đây là một giảm hành vi tôi đã đi qua:
<?php
class Foo {
public function dofoo() {
static $i = 0;
echo $i++ . '<br>';
}
}
$f = new Foo;
$g = new Foo;
$f->dofoo(); // expected 0, got 0
$f->dofoo(); // expected 1, got 1
$f->dofoo(); // expected 2, got 2
$g->dofoo(); // expected 0, got 3
$g->dofoo(); // expected 1, got 4
$g->dofoo(); // expected 2, got 5
Bây giờ, tôi lại có thể ngờ $i
để được tĩnh mỗi trường hợp, nhưng trong thực tế $i
được chia sẻ giữa các trường hợp. Đối với sự chỉnh sửa của riêng tôi, ai đó có thể giải thích lý do tại sao đây là trường hợp, và nơi nó được ghi lại trên php.net?
Tài liệu đó dành cho các thuộc tính và phương thức lớp tĩnh, không phải các biến tĩnh trong một phương thức. –
Adam: Trong PHP5, chúng là một và giống nhau. Tĩnh tĩnh. – hobodave
Trong tâm trí của tôi, '$ f-> dofoo()' không phải là phương thức giống như '$ g-> dofoo()'. Rõ ràng các nhà phát triển PHP không thuộc cùng một tâm trí. :) –