Zeev Suraski wrote:
> This should really be implemented 100% in compile time, if you touch
> zend_execute.c, BUZZ :)
> Anyway, incidentally, Jani implemented this very patch a few days
> ago. We'll probably import it within a couple of days after we verify
> that it doesn't cause any gotcha's...
>
> Zeev
As we chatted breifly on IRC,- Jani's patch implemented __FUNCTION__ and
__CLASS__ as compile time values, hence in the example below they would
return "base_class::test", and not extended_class::test
<?
class extended_class extends base_class { }
class base_class {
function test() {
echo __FUNCTION__ "::" __CLASS__;
}
}
extended_class::test();
?>
while this is also very usefull, the real desire/need I had was to get
the 'called' class name (some examples of usage are below), which is a
bit more complex to retreive: - as it is part of the calling scope of
zend_execute, but not currently passed down to the running scope...
The implementation of this 'feature' does raise a few issue - should it
be a constant, function call or a variable?
Constant: __THIS__
Unlike all other magic constants, like __FILE__,_LINE__ etc. it is not
possible (AFAICS) to 'set' the value at compile time. - hence the rather
chessy hack to the Constant callback on the execute loop. - The more I
look at this the worse it looks :)
Function call: class_get_name() or class_get_called_name();
The present implemenation tagged extra information onto the function
call (a pointer to the classname), I attepted to use a function call,
this would involve adding an additional item to exectute globals eg.
EG(active_class_name), and setting and unsetting, before after each
function call.
Variable: $_THIS or $THIS or $__THIS__
This would involve pretty much replicating the current ZE1 code that
creates '$this' and do something like if EX(called_class_name) ... make
it as a zval in the called method's scope.
Considering this would __only__ happen on static method calls, and the
size of the 'Class Name' is not normally Huge..., I think the very minor
performance hit of creating this on static calls would be worth it.....
and is simple to implement as well.
(This is my favourite candidate at present :)
The last option does not alter any key 'structures', which I found broke
the ZendAPI, causeing some zend extensions to segfault :)
-------Ok some code that uses it
class database_tools {
/* the normal 'get' method */
function &static_get($k,$v=NULL) {
$obj = new $__THIS__;
$obj->get($k,$v)
return $obj;
}
function get($k,$v=NULL) {
if ($v === NULL) {
$v = $k;
$keys = $this->_get_keys();
$k = $keys[0];
}
$this->$k = $v;
$this->select();
}
class db_users extends database_tools {
var $_table = "person";
function get($k,$v) {
$this->$k = $v;
if ($k = "firstname_letter");
$this->where_add("firstname like '$v%'");
$this->select();
}
}
class db_classrooms extends database_tools {
var $_table = "classrooms";
}
--- and the calling code examples...
$classroom = db_classrooms::static_get("number",12304);
$person = db_users::static_get(123);
$person = db_users::static_get("email","[EMAIL PROTECTED]");
$person = db_users::static_get("firstname_letter","a"); /
-- only way to do something similar without $__THIS__
$classroom = database_tools::static_get("db_classrooms","number",12304);
$person = database_tools::static_get("db_users",123);
$person = database_tools::static_get("db_users","email","[EMAIL PROTECTED]");
$person = database_tools::static_get("db_users","firstname_letter","a");
apart from the 'slightly shorter' naming :), the first example reads
alot better.. - eg. I'm asking the users object for item 123..
whereas the database_tools is supposed to be a 'utility class' not an
publically visable 'interface class'
that whole code could be simplified again if the get method knew it was
being called statically.. and could call it'self!
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php