从 PHP 中的成员函数访问私有变量

2022-08-30 19:22:08

我从 中派生了一个类,基本上是这样的:Exception

class MyException extends Exception {

    private $_type;

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

    public function __toString() {

        include "sometemplate.php";
        return "";

    }

}

然后,我从这样推导出:MyException

class SpecialException extends MyException {

    private $_type = "superspecial";

}

如果我从一个函数中,抓住它,然后去,那么该函数应该加载一个模板,显示该模板,然后实际上不返回任何内容来回显。throw new SpecialException("bla")echo $e__toString

这基本上就是模板文件中的内容

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

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

</div>

在我看来,这绝对应该有效。但是,当抛出异常并尝试显示它时,我收到以下错误:

致命错误: 无法访问私有属性 SpecialException::$_type C:\path\to\exceptions.php74

谁能解释一下我为什么在这里打破规则?我是否在用这段代码做一些非常诙谐的事情?有没有一种更习惯用的方法来处理这种情况?该变量的要点是(如图所示),我希望根据捕获的异常类型使用不同的div类。$_type


答案 1

只是一个如何访问私有财产的例子

<?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];
}

答案 2

将受保护的变量命名为:

* Public: anyone either inside the class or outside can access them
* Private: only the specified class can access them. Even subclasses will be denied access.
* Protected: only the specified class and subclasses can access them

推荐