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

Reply via email to