PHP学习心得


对象池

<ul> <li>用来管理对象缓存。</li> <li>对象池是一组已经初始化过且可以直接使用的对象集合,需要使用对象时不是直接new,而是从对象池中取出,如果对象池中没有空闲对象,则新建一个空闲对象,并在不需要时重新放进对象池而非销毁。</li> <li>如果对象实例化的代价高且经常需要实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的性能提升。</li> <li>对象池技术的使用非常广泛,例如线程池、数据库连接池、任务队列池、图片资源对象池等。</li> </ul> <h2>代码示例</h2> <pre><code class="language-PHP">&lt;?php /** * 字符串反向工作者 */ class StringReverseWorker { public function __construct() { } public function run($text) { return strrev($text); } } /** * 工作池 */ class WorkerPool implements Countable { /** * @var StringReverseWorker[] */ private $occupiedWorkers = []; /** * @var StringReverseWorker[] */ private $freeWorkers = []; public function get() { if (count($this-&gt;freeWorkers) == 0) { $worker = new StringReverseWorker(); } else { $worker = array_pop($this-&gt;freeWorkers); } $this-&gt;occupiedWorkers[spl_object_hash($worker)] = $worker; return $worker; } public function dispose(StringReverseWorker $worker) { $key = spl_object_hash($worker); if (isset($this-&gt;occupiedWorkers[$key])) { unset($this-&gt;occupiedWorkers[$key]); $this-&gt;freeWorkers[$key] = $worker; } } public function count() { return count($this-&gt;occupiedWorkers) + count($this-&gt;freeWorkers); } } $workerPool = new WorkerPool(); $stringReverseWorker1 = $workerPool-&gt;get(); $stringReverseWorker1 -&gt; run('test'); $workerPool -&gt; dispose($stringReverseWorker1); </code></pre>

页面列表

ITEM_HTML