📄 language.oop5.patterns.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title>Patterns</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body><div style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop5.iterations.html">Object Iteration</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.magic.html">Magic Methods</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects (PHP 5)</a></div> <div class="home"><a href="index.html">PHP Manual</a></div></div><hr /><div id="language.oop5.patterns" class="sect1"> <h2 class="title">Patterns</h2> <p class="para"> Patterns are ways to describe best practices and good designs. They show a flexible solution to common programming problems. </p> <div id="language.oop5.patterns.factory" class="sect2"> <h3 class="title">Factory</h3> <p class="para"> The Factory pattern allows for the instantiation of objects at runtime. It is called a Factory Pattern since it is responsible for "manufacturing" an object. A Parameterized Factory receives the name of the class to instantiate as argument. </p> <div class="example"> <p><b>Example #1 Parameterized Factory Method</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br /> </span><span style="color: #FF8000">// The parameterized factory method<br /> </span><span style="color: #007700">public static function </span><span style="color: #0000BB">factory</span><span style="color: #007700">(</span><span style="color: #0000BB">$type</span><span style="color: #007700">)<br /> {<br /> if (include_once </span><span style="color: #DD0000">'Drivers/' </span><span style="color: #007700">. </span><span style="color: #0000BB">$type </span><span style="color: #007700">. </span><span style="color: #DD0000">'.php'</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$classname </span><span style="color: #007700">= </span><span style="color: #DD0000">'Driver_' </span><span style="color: #007700">. </span><span style="color: #0000BB">$type</span><span style="color: #007700">;<br /> return new </span><span style="color: #0000BB">$classname</span><span style="color: #007700">;<br /> } else {<br /> throw new </span><span style="color: #0000BB">Exception </span><span style="color: #007700">(</span><span style="color: #DD0000">'Driver not found'</span><span style="color: #007700">);<br /> }<br /> }<br />}<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <div class="example-contents"><p> Defining this method in a class allows drivers to be loaded on the fly. If the <i>Example</i> class was a database abstraction class, loading a <i>MySQL</i> and <i>SQLite</i> driver could be done as follows: </p></div> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Load a MySQL Driver<br /></span><span style="color: #0000BB">$mysql </span><span style="color: #007700">= </span><span style="color: #0000BB">Example</span><span style="color: #007700">::</span><span style="color: #0000BB">factory</span><span style="color: #007700">(</span><span style="color: #DD0000">'MySQL'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Load a SQLite Driver<br /></span><span style="color: #0000BB">$sqlite </span><span style="color: #007700">= </span><span style="color: #0000BB">Example</span><span style="color: #007700">::</span><span style="color: #0000BB">factory</span><span style="color: #007700">(</span><span style="color: #DD0000">'SQLite'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> </div> <div id="language.oop5.patterns.singleton" class="sect2"> <h3 class="title">Singleton</h3> <p class="para"> The Singleton pattern applies to situations in which there needs to be a single instance of a class. The most common example of this is a database connection. Implementing this pattern allows a programmer to make this single instance easily accessible by many other objects. </p> <div class="example"> <p><b>Example #2 Singleton Function</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br /> </span><span style="color: #FF8000">// Hold an instance of the class<br /> </span><span style="color: #007700">private static </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /> <br /> </span><span style="color: #FF8000">// A private constructor; prevents direct creation of object<br /> </span><span style="color: #007700">private function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() <br /> {<br /> echo </span><span style="color: #DD0000">'I am constructed'</span><span style="color: #007700">;<br /> }<br /><br /> </span><span style="color: #FF8000">// The singleton method<br /> </span><span style="color: #007700">public static function </span><span style="color: #0000BB">singleton</span><span style="color: #007700">() <br /> {<br /> if (!isset(</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instance</span><span style="color: #007700">)) {<br /> </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">__CLASS__</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">$c</span><span style="color: #007700">;<br /> }<br /><br /> return </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /> }<br /> <br /> </span><span style="color: #FF8000">// Example method<br /> </span><span style="color: #007700">public function </span><span style="color: #0000BB">bark</span><span style="color: #007700">()<br /> {<br /> echo </span><span style="color: #DD0000">'Woof!'</span><span style="color: #007700">;<br /> }<br /><br /> </span><span style="color: #FF8000">// Prevent users to clone the instance<br /> </span><span style="color: #007700">public function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #0000BB">trigger_error</span><span style="color: #007700">(</span><span style="color: #DD0000">'Clone is not allowed.'</span><span style="color: #007700">, </span><span style="color: #0000BB">E_USER_ERROR</span><span style="color: #007700">);<br /> }<br /><br />}<br /><br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <div class="example-contents"><p> This allows a single instance of the <i>Example</i> class to be retrieved. </p></div> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// This would fail because the constructor is private<br /></span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Example</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// This will always retrieve a single instance of the class<br /></span><span style="color: #0000BB">$test </span><span style="color: #007700">= </span><span style="color: #0000BB">Example</span><span style="color: #007700">::</span><span style="color: #0000BB">singleton</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-></span><span style="color: #0000BB">bark</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// This will issue an E_USER_ERROR.<br /></span><span style="color: #0000BB">$test_clone </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$test</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> </div></div><hr /><div style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop5.iterations.html">Object Iteration</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.magic.html">Magic Methods</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects (PHP 5)</a></div> <div class="home"><a href="index.html">PHP Manual</a></div></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -