PHP 프로그램을 코딩할 때 향후 코드를 더 잘 유지하고 이해하려면 적절한 디자인 패턴을 사용하는 것이 필수적입니다. 오류나 부적절한 패턴이 있으면 먼저 여러분에게 알려드리겠습니다. PHP 사용자가 이를 지적하는 데 도움을 줄 수 있습니다.
PHP에서 객체의 생존 기간은 스크립트 시작부터 스크립트 끝까지이므로 PHP의 싱글톤 모드는 한 페이지에서 여러 번만 사용됩니다(한 페이지에 단일 페이지가 아닌 다른 여러 페이지가 포함될 수 있음). 좁은 의미) 이 개체는 효과만 적용되며 새 개체는 여러 번 사용하면 반복되지 않으며(여러 사람이 프로젝트를 진행하는 경우 하나의 요청에서 개체가 여러 번 인스턴스화되는 것은 불가피함) 불필요한 시간이 소요됩니다. 리소스가 소모되지 않습니다(데이터 제어 연결 작업의 효과는 분명합니다). 또 다른 점은 전체 스크립트가 동일한 개체임을 보장할 수 있다는 것입니다. 이 모드는 어떻게 구현됩니까? 구현:
1. 첫 번째는 __construct() 메서드를 비공개 메서드로 정의하여 new를 통해 새 인스턴스를 얻을 수 없도록 하는 것입니다. 싱글톤 모드는 외부에서는 인스턴스화할 수 없지만 자체적으로는 인스턴스화할 수 있습니다.
2. 또한 클래스 외부에서 복제되지 않도록 __clone() 메서드를 보호합니다
2. 그런 다음 인스턴스를 저장하는 데 사용되는 전용 변수와 전용 변수를 가져오는 공용 함수 getInstance()를 정의합니다.
<?<span>php </span><span>/*</span><span>* * 设计模式——单例模式 * @author 燕睿涛(luluyrt@163.com) </span><span>*/</span> <span>class</span><span> Singlemodel{ </span><span>/*</span><span>* * 保存Singlemodel实例的变量 * @var Singlemodel $_instance </span><span>*/</span> <span>private</span> <span>static</span> <span>$_instance</span> = <span>null</span><span>; </span><span>/*</span><span>* * 屏蔽掉通过new来实例化该对象 </span><span>*/</span> <span>private</span> <span>function</span><span> __construct(){ </span><span>//</span><span>空函数就行</span> <span> } <span> /*</span><span>*</span></span>
<span><span> * 屏蔽掉通过clone来克隆该对象</span></span>
<span><span>*/</span> </span>
<span> <span>private</span> <span>function</span><span> __clone(){ </span></span>
<span><span>//</span><span>空函数就行</span> </span>
<span> <span>}</span> </span><span>/*</span><span>* * 通过该方法获取实例,防止多次实例化 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> getInstance(){ </span><span>if</span>(!(self::<span>$_instance</span><span> instanceof self)){ self</span>::<span>$_instance</span> = <span>new</span><span> self(); } </span><span>return</span> self::<span>$_instance</span><span>; } }</span>
공허한 이야기이고 설득력이 없습니다. 구체적인 효과 차이를 사례를 통해 살펴보겠습니다
<?<span>php </span><span>/*</span><span>* * 设计模式——单例模式——测试 * @author 燕睿涛(luluyrt@163.com) </span><span>*/</span> <span>class</span><span> Singlemodel{ </span><span>/*</span><span>* * 保存Singlemodel实例的变量 * @var Singlemodel $_instance </span><span>*/</span> <span>private</span> <span>static</span> <span>$_instance</span> = <span>null</span><span>; </span><span>private</span> <span>$_link</span> = <span>null</span><span>; </span><span>/*</span><span>* * 屏蔽掉通过new来实例化该对象(也可以去掉) * 这里来测试数据库连接 </span><span>*/</span> <span>private</span> <span>function</span><span> __construct(){ </span><span>$this</span>->_link = <span>mysqli_connect</span>("localhost","root","","mysql"<span>); } </span><span>/*</span><span>* * 通过该方法获取实例,防止多次实例化 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> getInstance(){ </span><span>if</span>(!(self::<span>$_instance</span><span> instanceof self)){ self</span>::<span>$_instance</span> = <span>new</span><span> self(); } </span><span>return</span> self::<span>$_instance</span><span>; } </span><span>/*</span><span>* * 测试1,通过使用单例模式 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> testOne(){ </span><span>return</span> self::<span>getInstance(); } </span><span>/*</span><span>* * 测试1,通过使用单例模式 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> testTwo(){ </span><span>return</span> <span>new</span><span> self(); } } </span><span>$obj</span> = <span>array</span><span>(); </span><span>$begin</span> = <span>microtime</span>(<span>true</span><span>); </span><span>for</span>(<span>$i</span>=0;<span>$i</span><100;<span>$i</span>++<span>){ </span><span>/*</span><span> * 这里进行两次测试,testOne应用了单例模式,testTwo没有应用单例模式, * 我们分别看看他们占用的资源和耗费的时间 </span><span>*/</span> <span>//</span><span>$obj[$i] = Singlemodel::testOne();</span> <span>$obj</span>[<span>$i</span>] = Singlemodel::<span>testTwo(); } </span><span>echo</span> "程序运行期间最大内存占用:".memory_get_peak_usage()."bytes\r"<span>; </span><span>echo</span> "程序运行耗时:".<span>floatval</span>(<span>microtime</span>(<span>true</span>) - <span>$begin</span>)."s\r";
먼저 $obj[$i] = Singlemodel::testTwo(); 행을 주석 처리합니다. 싱글톤 모드를 사용하면 다음을 얻을 수 있습니다. 결과
그런 다음 $obj[$i] = Singlemodel::testOne();을 주석 처리하고, 비싱글톤 모드를 사용하면 다음과 같은 결과를 얻습니다
볼 수 있습니다
100次测试 | 单例模式 | 普通模式 | 普通/单例(倍) |
内存(bytes) | 143816 | 847376 | 5.89 |
时间(s) | 0.0112519 | 0.2541389 | 22.59 |
5次测试 | |||
bytes | 140432 | 168984 | 1.20 |
s | 0.0112612 | 0.0173110 | 1.54 |
스크립트에 의해 실행되는 링크의 개수가 100개일 때, 싱글톤 모드의 성능은 메모리 사용량 측면에서 일반 모드보다 거의 6배 향상되고, 시간적으로는 거의 23배 더 빨라지는 것을 알 수 있습니다. 싱글턴 모드에서 소비하는 메모리와 시간은 기본적으로 변경되지 않았으며, 여기서 주목해야 할 점은 비싱글턴 모드에서 계속 증가하기 때문입니다. 모드에서는 링크 수가 어느 정도 증가하면 오류가 보고됩니다." mysqli_connect(): (08004/1040): Trop de connexions in"은 동시 연결이 너무 많다는 의미입니다. 다음 명령을 통해 최대 mysql 연결 수 설정을 확인하십시오. 오류가 보고되는 이유를 알 수 없도록 주의해야 합니다.
show variables <span>like</span> <span>'</span><span>max_connections</span><span>'</span>;
이 시점에서 직접 테스트해 보면 연결 수가 상대적으로 적을 때 그 차이가 상대적으로 작다는 것을 알 수 있습니다(위의 한 요청에 연결이 5개 있을 때와 마찬가지로). 하나의 요청에 많은 인스턴스화도 가능하므로 효과가 없다는 뜻인가요? 10ms 수준의 차이라도 동시성이 높은 시스템에서도 유용합니다. 우리는 그것을 사용함으로써 많은 이점을 얻습니다.
싱글턴 패턴에 대한 내용은 여기까지입니다. 다음번에 다른 디자인 패턴에 대해서도 이야기해보겠습니다. 잘못된 부분이 있으면 메시지나 이메일로 지적해주세요.
보내주세요~
위 내용은 PHP 디자인 패턴(1)을 내용적인 측면까지 포함하여 소개한 내용으로, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.