[Typo3-dev] Alternative to hooks - fake "$this"
dan frost
dan at danfrost.co.uk
Thu Oct 28 12:54:16 CEST 2004
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