From: tolan333 at gmail dot com Operating system: Any PHP version: Irrelevant Package: Class/Object related Bug Type: Feature/Change Request Bug description:Add a function to detect a methods calling context
Description: ------------ Currently it is hard to get to know the exact context from which a method is called from. Sure, there is debug_backtrace and the Reflection API, but these are no ideal nor complete and reliable solutions. I suggest to introduce a new function: get_calling_context (similar to get_calling_class). A possible use-case is shown below Possible return values could be: <?php const PHP_CONTEXT_PRIVATE = ?, // Method was called from the class it is defined in. PHP_CONTEXT_INHERITED = ?, // Method was called from a class inheriting the defining class. PHP_CONTEXT_EXTERN_USER = ?, // Method was called from outside the class, but in userland code PHP_CONTEXT_EXTERN_CORE = ?; // Method was called from outside, but was used as callback (Session handler, error handler, any predefined function awaiting a callback ?> Use case: Currently I use virtual properties (via __get and __set) to validate and manipulate properties data while still keeping the ability to iterate over the entire object(implementing IteratorAggregate). This allows me also to have different visibility states for accessors (which will hopefully be supported in 5.5 without having to rely on custom implementations) but not for the properties themself. Simplified __set implementation: <?php public function __set($name, $value) { // called from wrong context if (\property_exists($this, $name)) { if (\method_exists($this, 'set' . \ucfirst($name))) { return $this->{'set' . \ucfirst($name)}($value); } else { throw new WritePropertyFromWrongContextException("virtual property $name can not be accessed from this context"); } } elseif (\method_exists($this, 'set' . \ucfirst($name))) { return $this->{'set' . \ucfirst($name)}($value); } elseif ($this->objectConfiguration['accessMapAsProps'] == true && $this->offsetExists($name)) { $this[$name] = $this->createPropertyValidator($name)->validate($value,$this->getRuleSet()[$name])->getValidatedValue(); } else { throw new WriteNonExistingPropertyException("Virtual property \$$name does not exist in class " . \get_class($this)); } } ?> There is no possibility to react on different scenarios as there can be only one __set which is either public,protected or private. There is no option to implement different behaviors for different visibility. Another usecase is the usage of object callbacks in handlers like session.set.save.handler For example the write callback does not (per documentation) output data. However in debug scenarios and in unit-tests it would be ideal to know if the method was called from the core as a usual session handler or in a different scenario in usercode. Additionally this would go inline with already existing functions like get_called_class, get_parent_class and partly get_class. -- Edit bug report at https://bugs.php.net/bug.php?id=63834&edit=1 -- Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=63834&r=trysnapshot54 Try a snapshot (PHP 5.3): https://bugs.php.net/fix.php?id=63834&r=trysnapshot53 Try a snapshot (trunk): https://bugs.php.net/fix.php?id=63834&r=trysnapshottrunk Fixed in SVN: https://bugs.php.net/fix.php?id=63834&r=fixed Fixed in release: https://bugs.php.net/fix.php?id=63834&r=alreadyfixed Need backtrace: https://bugs.php.net/fix.php?id=63834&r=needtrace Need Reproduce Script: https://bugs.php.net/fix.php?id=63834&r=needscript Try newer version: https://bugs.php.net/fix.php?id=63834&r=oldversion Not developer issue: https://bugs.php.net/fix.php?id=63834&r=support Expected behavior: https://bugs.php.net/fix.php?id=63834&r=notwrong Not enough info: https://bugs.php.net/fix.php?id=63834&r=notenoughinfo Submitted twice: https://bugs.php.net/fix.php?id=63834&r=submittedtwice register_globals: https://bugs.php.net/fix.php?id=63834&r=globals PHP 4 support discontinued: https://bugs.php.net/fix.php?id=63834&r=php4 Daylight Savings: https://bugs.php.net/fix.php?id=63834&r=dst IIS Stability: https://bugs.php.net/fix.php?id=63834&r=isapi Install GNU Sed: https://bugs.php.net/fix.php?id=63834&r=gnused Floating point limitations: https://bugs.php.net/fix.php?id=63834&r=float No Zend Extensions: https://bugs.php.net/fix.php?id=63834&r=nozend MySQL Configuration Error: https://bugs.php.net/fix.php?id=63834&r=mysqlcfg