aidan Fri Oct 29 23:39:07 2004 EDT
Modified files: /phpdoc/en/language/oop5 patterns.xml Log: Better examples http://cvs.php.net/diff.php/phpdoc/en/language/oop5/patterns.xml?r1=1.1&r2=1.2&ty=u Index: phpdoc/en/language/oop5/patterns.xml diff -u phpdoc/en/language/oop5/patterns.xml:1.1 phpdoc/en/language/oop5/patterns.xml:1.2 --- phpdoc/en/language/oop5/patterns.xml:1.1 Fri Oct 29 07:28:28 2004 +++ phpdoc/en/language/oop5/patterns.xml Fri Oct 29 23:39:06 2004 @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.1 $ --> +<!-- $Revision: 1.2 $ --> <sect1 id="language.oop5.patterns"> <title>Patterns</title> <para> @@ -19,10 +19,9 @@ <programlisting role="php"> <![CDATA[ <?php -class DB { - // ... Other methods - - // The Factory Method +class Example +{ + // The factory method function &factory($type) { if (include_once 'Drivers/' . $type . '.php') { @@ -38,17 +37,18 @@ </programlisting> <para> Defining this method in a class allows drivers to be loaded on the - fly. Loading a <literal>MySQL</literal> and a + 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 -$db_mysql = DB::factory('MySQL'); +$mysql = Example::factory('MySQL'); // Load a SQLite Driver -$db_sqlite = DB::factory('SQLite'); +$sqlite = Example::factory('SQLite'); ?> ]]> </programlisting> @@ -69,30 +69,52 @@ <programlisting role="php"> <![CDATA[ <?php -function &singleton($class) -{ - // Declare a static variable to hold the object instance - static $instance; - - // If the instance is not there create one - if (!isset($instance)) { - $instance = new $class; +class Example +{ + // Hold an instance of the class + static private $instance; + + // A private constructor + private function __construct() + { + echo 'I am constructed'; } - return($instance); + // The singleton method + static public function singleton() + { + if (!isset(self::$instance)) { + $c = __CLASS__; + self::$instance = new $c; + } + + return self::$instance; + } + + // Example method + public function bark() + { + echo 'Woof!'; + } } ?> ]]> </programlisting> <para> - This allows a single instance of any class to be retrieved. - Loading an example <literal>DB</literal> could be done like so: + This allows a single instance of the <literal>Example</literal> + class to be retrieved. </para> <programlisting role="php"> <![CDATA[ <?php -$db = singleton('DB'); +// 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(); + ?> ]]> </programlisting>