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