PHP中有没有我不知道的只读属性?如何将公共属性设置为只读??
我只是在玩ReflectionClass,在尝试覆盖属性时收到以下错误消息:
$lol = new ReflectionObject($obj);
$lol->name = 'awawawawa';发布于 2012-02-17 00:09:11
从ReflectionObject的PHP手册页面:
Properties
name
Name of the object's class. Read-only, throws ReflectionException in attempt to write.http://sk.php.net/manual/en/class.reflectionobject.php
在上没有太多关于是如何做到这一点的,但我的猜测是,它明确地注意到了name属性的编写,并阻止了它的发生,因为它会使反射成为一种谎言。
你自己也可以做类似的事情:
<?php
class MyReadOnlyJunk
{
protected // over private, or not defined here at all
$name = 'My Name';
public function __set($key, $val)
{
if($key == 'name')
throw new Exception('Cannot has name set!');
}
}
?>发布于 2012-02-17 00:39:30
来自反射类的代码:
/* {{{ _reflection_write_property */
static void _reflection_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
{
if ((Z_TYPE_P(member) == IS_STRING)
&& zend_hash_exists(&Z_OBJCE_P(object)->default_properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1)
&& ((Z_STRLEN_P(member) == sizeof("name") - 1 && !memcmp(Z_STRVAL_P(member), "name", sizeof("name")))
|| (Z_STRLEN_P(member) == sizeof("class") - 1 && !memcmp(Z_STRVAL_P(member), "class", sizeof("class")))))
{
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
"Cannot set read-only property %s::$%s", Z_OBJCE_P(object)->name, Z_STRVAL_P(member));
}
else
{
zend_std_obj_handlers->write_property(object, member, value TSRMLS_CC);
}
}
/* }}} */所以基本上,对于"name“和"class”属性它是明确禁止的。但是,我找不到任何类属性存在的迹象!
发布于 2012-02-17 00:08:36
对象类的
名称。只读,尝试写入时抛出ReflectionException。
不过,我在Properties页面中没有看到任何关于将内容设置为只读的内容...我猜可能会在它们前面加上final,但我不知道这是否允许,因为它只在方法中提到。
https://stackoverflow.com/questions/9314593
复制相似问题