PHP上的大多数资源都不会触及内存管理,因为语言本身对于为您做这件事非常好。然而,在PHP中,您通常最终会处理不是内存的外部资源 - 数据库句柄,会话,数据库事务等等。这些外部资源可以使用某种形式的RAII对象进行干净地管理。PHP支持RAII模式吗?怎么样?
我最初认为PHP使用了类似于JVM或CLR的垃圾收集方案,其中析构函数的概念不存在。 (记住:Everyone thinks about garbage collection the wrong way - 终结器不是破坏者!)有特殊的__destruct
方法,但我认为这是一个类似于Java或C#终结器的“终结器”。由于这个原因,你不能在JVM或CLR上使用RAII(C#的using
块可以让你获得大约95%的路,但这有点不同......)。
但是,Google seems to indicate that PHP supports the RAII pattern,虽然我无法在PHP文档中找到此验证。语言是否支持这一点,并且将清理逻辑放在__destruct
之内足以完成RAII任务?
另一个警告:当多个对象在同一时间离开的范围,它们的析构函数被调用的顺序是正式定义,通常在FIFO顺序(完全与正确的RAII所需的相反)。这对我的特殊用例来说是一个破坏者。 – Brilliand 2014-01-27 20:29:34
@Brilliand你可以人为地添加大括号来强制排序? :) – hobbs 2014-01-27 20:53:33