Pas*_*TIN 21

我认为对于类属性,解决方案是:

  • 没有定义具有您感兴趣的名称的属性
  • 使用魔术__get方法使用"假"名称访问该属性
  • 定义__set方法,以便在尝试设置该属性时抛出异常.
  • 有关魔术方法的更多信息,请参阅重载.

对于变量,我认为不可能有一个只读变量,当你试图写入时,PHP会抛出异常.


例如,考虑这个小班:

class MyClass {
    protected $_data = array(
        'myVar' => 'test'
    );

    public function __get($name) {
        if (isset($this->_data[$name])) {
            return $this->_data[$name];
        } else {
            // non-existant property
            // => up to you to decide what to do
        }
    }

    public function __set($name, $value) {
        if ($name === 'myVar') {
            throw new Exception("not allowed : $name");
        } else {
            // => up to you to decide what to do
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实现类并尝试读取属性:

$a = new MyClass();
echo $a->myVar . '<br />';
Run Code Online (Sandbox Code Playgroud)

会得到你预期的输出:

test
Run Code Online (Sandbox Code Playgroud)

在尝试写入房产时:

$a->myVar = 10;
Run Code Online (Sandbox Code Playgroud)

会得到一个例外:

Exception: not allowed : myVar in /.../temp.php on line 19
Run Code Online (Sandbox Code Playgroud)


che*_*rtz 14

class test {
   const CANT_CHANGE_ME = 1;
}
Run Code Online (Sandbox Code Playgroud)

你把它称为 test::CANT_CHANGE_ME

  • @ user198729为什么你要*抛出自定义异常? (3认同)