mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-18 18:08:54 +00:00

git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@179740 c90b9560-bf6c-de11-be94-00142212c4b1
155 lines
3.5 KiB
XML
155 lines
3.5 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision: 1.7 $ -->
|
|
<sect1 id="language.oop5.patterns">
|
|
<title>Patterns</title>
|
|
<para>
|
|
Patterns are ways to describe best practices and good designs.
|
|
They show a flexible solution to common programming problems.
|
|
</para>
|
|
|
|
<sect2 id="language.oop5.patterns.factory">
|
|
<title>Factory</title>
|
|
<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.
|
|
</para>
|
|
<example>
|
|
<title>Factory Method</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class Example
|
|
{
|
|
// The factory method
|
|
public static function factory($type)
|
|
{
|
|
if (include_once 'Drivers/' . $type . '.php') {
|
|
$classname = 'Driver_' . $type;
|
|
return new $classname;
|
|
} else {
|
|
throw new Exception ('Driver not found');
|
|
}
|
|
}
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
Defining this method in a class allows drivers to be loaded on the
|
|
fly. If the <literal>Example</literal> class was a database
|
|
abstraction class, loading a <literal>MySQL</literal> and
|
|
<literal>SQLite</literal> driver could be done as follows:
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// Load a MySQL Driver
|
|
$mysql = Example::factory('MySQL');
|
|
|
|
// Load a SQLite Driver
|
|
$sqlite = Example::factory('SQLite');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
|
|
<sect2 id="language.oop5.patterns.singleton">
|
|
<title>Singleton</title>
|
|
<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.
|
|
</para>
|
|
<example>
|
|
<title>Singleton Function</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class Example
|
|
{
|
|
// Hold an instance of the class
|
|
private static $instance;
|
|
|
|
// A private constructor; prevents direct creation of object
|
|
private function __construct()
|
|
{
|
|
echo 'I am constructed';
|
|
}
|
|
|
|
// The singleton method
|
|
public static function singleton()
|
|
{
|
|
if (!isset(self::$instance)) {
|
|
$c = __CLASS__;
|
|
self::$instance = new $c;
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
// Example method
|
|
public function bark()
|
|
{
|
|
echo 'Woof!';
|
|
}
|
|
|
|
// Prevent users to clone the instance
|
|
public function __clone()
|
|
{
|
|
trigger_error('Clone is not allowed.', E_USER_ERROR);
|
|
}
|
|
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
This allows a single instance of the <literal>Example</literal>
|
|
class to be retrieved.
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// This would fail because the constructor is private
|
|
$test = new Example;
|
|
|
|
// This will always retrieve a single instance of the class
|
|
$test = Example::singleton();
|
|
$test->bark();
|
|
|
|
// This will issue an E_USER_ERROR.
|
|
$test_clone = clone($test);
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"../../manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|