php-doc-en/language/oop5/patterns.xml
2006-11-27 21:17:13 +00:00

156 lines
3.6 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.9 $ -->
<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. A Parameterized Factory receives
the name of the class to instantiate as argument.
</para>
<example>
<title>Parameterized Factory Method</title>
<programlisting role="php">
<![CDATA[
<?php
class Example
{
// The parameterized 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
-->