Hầu hết các tài nguyên trên PHP không bao giờ chạm vào quản lý bộ nhớ vì ngôn ngữ chính nó là khá tốt khi làm điều này cho bạn. Tuy nhiên, trong PHP bạn thường kết thúc với các tài nguyên bên ngoài mà không phải là bộ nhớ - xử lý cơ sở dữ liệu, phiên, giao dịch cơ sở dữ liệu, vv Các tài nguyên bên ngoài này có thể được quản lý một cách rõ ràng nhất bằng cách sử dụng một số đối tượng RAII. Ban đầu tôi nghĩ rằng PHP đã sử dụng một lược đồ thu gom rác tương tự như JVM hoặc CLR, trong đó khái niệm về một destructor không tồn tại. (Hãy nhớ rằng: Everyone thinks about garbage collection the wrong way - finalizers không destructors!) Có phương pháp đặc biệt __destruct
, nhưng tôi nghĩ rằng đó là một "finalizer" tương tự như một Java hoặc C# finalizer. Vì lý do này, bạn không thể sử dụng RAII trên JVM hoặc CLR (C# 's using
khối giúp bạn có được khoảng 95% cách đó, nhưng đó là một chút khác nhau ...).PHP có hỗ trợ mẫu RAII không? Làm sao?
Tuy nhiên, Google seems to indicate that PHP supports the RAII pattern, mặc dù tôi không thể tìm thấy xác minh điều này trong tài liệu PHP. Ngôn ngữ có hỗ trợ điều này và đang đặt logic dọn dẹp trong __destruct
đủ để hoàn thành các tác vụ RAII không?
caveat Một: khi nhiều đối tượng rời khỏi phạm vi cùng một lúc, trình tự hủy của họ được gọi là chính thức không xác định, và thường theo thứ tự FIFO (chính xác đối diện với những gì cần thiết cho RAII thích hợp). Đó là một dealbreaker cho trường hợp sử dụng cụ thể của tôi. – Brilliand
@Brilliand bạn có thể thêm một cách giả tạo niềng răng để thực thi thứ tự? :) – hobbs
Niềng răng sẽ không làm điều đó - chỉ một chức năng mới có thể giới thiệu một phạm vi mới. Vẫn có thể, tôi cho rằng, nhưng điều đó có thể dẫn đến rất nhiều boilerplate. – Brilliand