|
Posted by Koncept on 01/09/07 15:58
In article <1168250213.972762.77460@s80g2000cwa.googlegroups.com>,
comp.lang.php <phillip.s.powell@gmail.com> wrote:
> [PHP]
> <?
> class EditResultGenerator extends MethodGeneratorForActionPerformer {
>
> /**
> * Create an instance of itself if $this does not yet exist as an
> EditResultGenerator class object
> *
> * @access private
> * @see is_class
> */
> function &generateSelf() { // STATIC VOID METHOD
> if (!is_object($this) || @!is_class($this, 'EditResultGenerator')) {
> $this->self =& new EditResultGenerator();
> } else {
> $this->self =& $this;
> }
> }
>
> }
> ?>
> [/PHP]
>
> This self-generating function serves a purpose to ensure that if part
> of the application does this:
>
> [PHP]
> <?
> EditResultGenerator::getResult();
> ?>
> [/PHP]
>
> That it will work *exactly* the same as if I did this:
>
> [PHP]
> <?
> $edit =& new EditResultGenerator();
> $result = $edit->getResult();
> ?>
> [/PHP]
>
> However, I cannot change hundreds of lines of code from the former to
> the latter just to ensure instantiation is uniform, so I'm stuck with
> the fact that I have to generate a $this->self EditResultGenerator
> class object if $this does not exist, otherwise, $this->self must be
> *absolutely identical* to $this, in fact, be a reference!
>
> This works beautifully in PHP 4.3+, but bombs in PHP 5.2.
>
> How can I get it to work in PHP 5.2+?
>
> Phil
>
For a PHP5 implementation, I wouldn't modify within
EditResultGenerator directly per sae. I would add a Singleton class and
then reference that as needed. For example..
<?php
class Singleton{
private static $instances = array();
private function __construct(){}
public function getInstance($class){
if(!array_key_exists($class, self::$instances)){
// PHP5 creates by reference "=&" automatically
self::$instances[$class] = new $class;
}
return self::$instances[$class];
}
public final function __clone(){
trigger_error( "Cannot clone Singleton class", E_USER_ERROR );
}
}
// Modified this class as a demo...
class MethodGeneratorForActionPerformer{
private $signature;
function __construct(){
$this->signature = rand();
}
function getUnique(){
echo "Unique signature is ", $this->signature,"\n";
}
}
class EditResultGenerator extends MethodGeneratorForActionPerformer {
// your other methods...
}
// Demo for getting single instance
$edit1 = Singleton::getInstance('EditResultGenerator');
$edit2 = Singleton::getInstance('EditResultGenerator');
// Test that they are the same
$edit1->getUnique();
$edit2->getUnique();
?>
--
Koncept <<
"The snake that cannot shed its skin perishes. So do the spirits who are
prevented from changing their opinions; they cease to be a spirit." -Nietzsche
Navigation:
[Reply to this message]
|