[Typo3-dev] Alternative to hooks - fake "$this"

Frank Benkart [DIACC] frank.benkart at diacc.de
Thu Oct 28 13:48:41 CEST 2004


Hi Dan,
nice idea! I would like to test it.

But how can I use the class typo3/move_el.php in my own extension?
When including this file, automatically an output is generated, because the
file includes a class and the intantiating of this class. That's not e rally
nice architecture....

What do you think about this?

---------------------------------------------
live strong - live typo3


"dan frost" <dan at danfrost.co.uk> schrieb im Newsbeitrag
news:mailman.1.1098957618.12231.typo3-dev at lists.netfielders.de...
> Dear all,
>
> Here's a trick i've used recently to fake the idea of hooks:
>
> First, we have a class which makes a query at some point:
>
> class first_class {
>    function main() {
>      //...do stuff
>
>      $query = '..something in here..';
>
>      //..do more stuff
>    }
> }
>
> To use this we would just do:
>
> $object = new first_class();
> $object->main();
>
> BUT! We need ot change the query. We shouldn't hack the code everytime
> the query changes because it's not nice. So, instead of making a hook we
> do three things:
> 1. Move the query to a function
> 2. create a reference variable in the class and point it to $this
> 3. ask the reference variable for the query.
>
> That is:
> class first_class {
>    var $_this = null;
>
>    function first_class() {
>       $this->_this = &$this;
>    }
>
>    function main() {
>      //...do stuff
>
>      $query = $this->_this->query();
>
>      //..do more stuff
>    }
>
>    function query() {
>      return '..some query goes here...';
>    }
> }
>
> Which is used just the same way:
> $object = new first_class();
> $object->main();
>
> NOW... we want to change the query. This is done in two steps:
> 1. create a second class with the function "query" in it
> 2. reference $object->_this to our new class's object
>
> function second_class {
>    function query() {
>      return '...a different query...';
>    }
> }
>
> This is used by doing:
>
> $object = new first_class();
> $queryObject = new second_class();
> $object->_this = &$queryObject;
> $object->main();
>
> This query used will be the one in second_class.
>
> For most situations, this is idential to hook. But, it's a whole load
> nicer in many  situations. For example, where a class does a lot of
> things (e.g. split something, move something, sum something, delete
> something, then edit something, compare something and then archive it)
> having to go "if(is_array(...some var))... then call the object..." is
> boring.
>
> This method puts the responsibility for implementing the hook outside
> the class which does the work. Much nicer!
>
> dan






More information about the TYPO3-dev mailing list