Accessing private/protected properties of an object in anonymous function in PHP

后端 未结 3 1263
深忆病人
深忆病人 2021-01-13 11:36

I\'m trying to dump elements of an object\'s private property through an anonymous function - of course I could achieve this in any number of other ways, but this highlights

相关标签:
3条回答
  • 2021-01-13 12:08

    As you said yourself, it is private and therefore in accessible.

    You can:

    • Pass $this->payload as a parameter to the anonymous function.
    • Create a method in the class and use it instead.
    0 讨论(0)
  • 2021-01-13 12:20

    I believe there is absolutely no way to do directly what you propose.

    However, you can work around it either by making the anonymous method a class method (this is not what you asked for, but it could be a practical solution) or pulling everything you need out of $this explicitly and passing the extracted values into the function:

    class MyClass
    {
        private $payload = Array( 'a' => 'A element', 'b' => 'B element');
    
        static $csvOrder = Array('b','a');
    
        public function toCSV(){
            $payload = $this->payload;
            $values = array_map(
                function($name) use ($payload) { return $payload[$name]; },  
                self::$csvOrder
            );
            return implode(',',$values);
        }
    }
    
    0 讨论(0)
  • 2021-01-13 12:29

    You can hack around the limitation by creating a wrapper that utilizes Reflection to allow you to access all properties and methods. You can use it like this then:

    $self = new FullAccessWrapper($this);
    function () use ($self) { /* ... */ }
    

    Here a sample implementation of the wrapper, taken from here:

    class FullAccessWrapper
    {
        protected $_self;
        protected $_refl;
    
        public function __construct($self)
        {
            $this->_self = $self;
            $this->_refl = new ReflectionObject($self);
        }
    
        public function __call($method, $args)
        {
            $mrefl = $this->_refl->getMethod($method);
            $mrefl->setAccessible(true);
            return $mrefl->invokeArgs($this->_self, $args);
        }
    
        public function __set($name, $value)
        {
            $prefl = $this->_refl->getProperty($name);
            $prefl->setAccessible(true);
            $prefl->setValue($this->_self, $value);
        }
    
        public function __get($name)
        {
            $prefl = $this->_refl->getProperty($name);
            $prefl->setAccessible(true);
            return $prefl->getValue($this->_self);
        }
    
        public function __isset($name)
        {
            $value = $this->__get($name);
            return isset($value);
        }
    }
    

    Obviously the above implementation doesn't cover all aspects (e.g. it can't use magic properties and methods).

    0 讨论(0)
提交回复
热议问题