Tôi đã found một số hành vi lạ (đối với tôi) của trình thông dịch PHP và tôi không chắc liệu có an toàn khi sử dụng nó trong sản xuất hay không.Gọi phương thức không tĩnh thông qua toán tử phân giải phạm vi
Khi chúng ta gọi là Foo::bar()
và lớp Foo
không có bar
phương pháp tĩnh nhưng nó có không tĩnh bar
phương pháp, người phiên dịch sẽ gọi không tĩnh bar
trên null
(vâng, nó có vẻ vô lý). Tôi mong đợi số __callStatic
được gọi trong trường hợp này. Nhưng nó không phải là những gì đang xảy ra vì một lý do nào đó.
Tôi đã sau đó tìm thấy một cách sử dụng tiện dụng cho hành vi này: để cung cấp các lớp học với phương pháp tĩnh và không tĩnh có cùng tên như thế này:
class Foo
{
public function bar(){
if (isset($this)) {
$this->nonStaticBar();
} else {
static::staticBar();
}
}
private function nonStaticBar() {
echo "Non-static\n";
}
private static function staticBar() {
echo "Static\n";
}
}
(new Foo())->bar(); // Output: "Non-static"
Foo::bar(); // Output: "Static"
Vâng, tôi biết, rằng phương pháp này không phải là thanh lịch và kiến trúc sai. Câu hỏi đặt ra là nếu nó an toàn (tuân thủ theo tiêu chuẩn) để sử dụng tính năng "" này hay không. Có trường hợp nào khác khi isset($this)
có thể bằng false
không?
Cảm ơn bạn đã tham khảo tài liệu. Tôi tin rằng '__callStatic' phải được gọi trong trường hợp này. Lớp không có phương thức tĩnh với tên như vậy. Và các tài liệu nói rằng '__callStatic() được kích hoạt khi gọi các phương thức không tiếp cận được trong một ngữ cảnh tĩnh.' – Kolyunya
@Kolyunya Một điều thú vị mà tôi nhận thấy khi cố gán/gán lại biến '$ this' trong một static (hoặc không tĩnh)) phương thức là nó sẽ trả về lỗi nghiêm trọng 'Lỗi nghiêm trọng: Không thể gán lại $ giá trị này trong/Path/to/file.php'. Vì vậy, mặc dù nó không phải là thực hành tốt nhất, tôi không thể tưởng tượng một trường hợp khác mà 'isset ($ this)' sẽ bằng 'false'. –