You are here: Re: I need $this->self to be identical to and reference to $this, but how in PHP 5.2+? « All PHP « IT news, forums, messages
Re: I need $this->self to be identical to and reference to $this, but how in PHP 5.2+?

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]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация