accessing private variable from member function in PHP

Viewed 55916

I have derived a class from Exception, basically like so:

class MyException extends Exception {

    private $_type;

    public function type() {
        return $this->_type; //line 74
    }

    public function __toString() {

        include "sometemplate.php";
        return "";

    }

}

Then, I derived from MyException like so:

class SpecialException extends MyException {

    private $_type = "superspecial";

}

If I throw new SpecialException("bla") from a function, catch it, and go echo $e, then the __toString function should load a template, display that, and then not actually return anything to echo.

This is basically what's in the template file

<div class="<?php echo $this->type(); ?>class">

    <p> <?php echo $this->message; ?> </p>

</div>

in my mind, this should definitely work. However, I get the following error when an exception is thrown and I try to display it:

Fatal error: Cannot access private property SpecialException::$_type in C:\path\to\exceptions.php on line 74

Can anyone explain why I am breaking the rules here? Am I doing something horribly witty with this code? Is there a much more idiomatic way to handle this situation? The point of the $_type variable is (as shown) that I want a different div class to be used depending on the type of exception caught.

8 Answers

just an example how to access private property

<?php
class foo {
    private $bar = 'secret';
}
$obj = new foo;


if (version_compare(PHP_VERSION, '5.3.0') >= 0)
{

      $myClassReflection = new ReflectionClass(get_class($obj));
      $secret = $myClassReflection->getProperty('bar');
      $secret->setAccessible(true);
      echo $secret->getValue($obj);
}
else 
{
    $propname="\0foo\0bar";
    $a = (array) $obj;
    echo $a[$propname];
}

Cannot access $this outside of a class. Instead, need to call an instance of the class. Then, access a function within the class which will return the message.

There is this way by using \Closure :

$reader = function ($object, $property) {
    $value = \Closure::bind(function () use ($property) {
         return $this->$property;
    }, $object, $object)->__invoke();

    return $value;
};

$myClass = new MyClass();
$property = $reader($myClass, 'yourProperty');
echo $property; // will display the value of property
Related