首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP只读属性?

PHP只读属性?
EN

Stack Overflow用户
提问于 2008-12-31 11:16:49
回答 7查看 50.2K关注 0票数 60

在使用PHP的DOM类(DOMNode、DOMEElement等)时,我注意到它们拥有真正的只读属性。例如,我可以读取DOMNode的$nodeName属性,但不能对其进行写入(如果这样做,则会抛出致命错误)。

如何在PHP中创建自己的只读属性?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-31 03:26:10

你可以这样做:

代码语言:javascript
复制
class Example {
    private $__readOnly = 'hello world';
    function __get($name) {
        if($name === 'readOnly')
            return $this->__readOnly;
        user_error("Invalid property: " . __CLASS__ . "->$name");
    }
    function __set($name, $value) {
        user_error("Can't set property: " . __CLASS__ . "->$name");
    }
}

只有在你真正需要它的时候才使用它--它比普通的属性访问慢。对于PHP,最好采用仅使用setter方法从外部更改属性的策略。

票数 45
EN

Stack Overflow用户

发布于 2009-12-05 00:55:54

但是,仅使用__get()公开的私有属性对于枚举对象成员的函数是不可见的,例如json_encode()。

我经常使用json_encode()将PHP对象传递给Javascript,因为它似乎是传递复杂结构的好方法,这些结构包含大量从数据库填充的数据。我必须在这些对象中使用公共属性,以便将这些数据填充到使用它的Javascript中,但这意味着这些属性必须是公共的(因此可能会冒着另一个与之不同的程序员(或者可能是我自己)直接修改它们的风险)。如果我将它们设为私有并使用__get()和__set(),那么json_encode()就看不到它们了。

拥有一个"readonly“可访问性关键字不是很好吗?

票数 12
EN

Stack Overflow用户

发布于 2009-08-04 22:41:34

我看你已经得到了答案,但对于那些仍在寻找的人来说:

只需将所有“只读”变量声明为私有或受保护的,并使用魔法方法__get(),如下所示:

代码语言:javascript
复制
/**
 * This is used to fetch readonly variables, you can not read the registry
 * instance reference through here.
 * 
 * @param string $var
 * @return bool|string|array
 */
public function __get($var)
{
    return ($var != "instance" && isset($this->$var)) ? $this->$var : false;
}

如您所见,我还保护了$ this ->实例变量,因为此方法将允许用户读取所有声明的变量。要阻塞多个变量,请使用带有in_array()的数组。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/402215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档