半夜起来看有没有人能解答。结果看到了楼上。我拜托,知道你们想帮忙。不过不要自以为是的连看完都不看完好不好?我不用考托福。我新加坡呆了5年。英语再差也能应付个手册吧。我翻译的好不好是一回事。我特地在二楼强调的,你不看。我从没说过那些是函数,你说我说了。我啥时候说了?我最多说过“方法”这两个字,因为手册原文用的就是method这个词。你不好好看就回来教育我?别说我咬文嚼字。我只是在强调,你干嘛连仔细看都不看看,就来说我。而且还讲起了语法。解答问题最起码你看清楚问题吧!而且你说了半天说了些没用的。echo 一个重载的属性无效?class A { private $a=100; public function __get($name) { echo __METHOD__; return $this->a; }
public function __isset($name) { echo __METHOD__; isset( $this->$name); } } $a=new A(); echo $a->a;这段代码虽然违背了__get的初衷。但是只作为一个例子来讲,怎么不是我想要的结果?
重载的属性2.另一个关键的英语你没翻译好是——
echo、empty、isset……这些不是函数,而是语言结构echo(某重载的属性)——这个是无效的,得不到你想要的结果这样大致能理解了吧?
{
private $a=100;
public function __get($name)
{
echo __METHOD__;
return $this->a;
}
public function __isset($name)
{
echo __METHOD__;
isset( $this->$name);
}
}
$a=new A();
echo $a->a;这段代码虽然违背了__get的初衷。但是只作为一个例子来讲,怎么不是我想要的结果?
不跟有为青年吵,再过五年都是你们的天下,我撤退
private $data=array(
'a'=>11,
'b'=>0
);
public function __get($var){
echo '---get---';
return $this->data[$var];
}
public function __isset($var){
echo '---isset---';
return isset($this->data[$var]);
}}$test=new Test();echo isset($test->a);
echo "\n";
echo empty($test->b);
echo "\n";
?>OUTPUT:
---isset---1
---isset------get---1
<?php
class A
{
private $a=100,$b;
public function __set($name,$value)
{
echo __METHOD__;
return $name=$value;
} public function __get($name)
{
echo __METHOD__;
return 0;
} public function _isset($name) // 故意写单下划线的
{
echo __METHOD__;
isset( $this->$name);
}
}
$a=new A();
var_dump(empty($a->b));
echo $a->b;
?>
bool(true)
A::__get0
中文手册中有这样的说明
Note:
在除isset外的其它语言结构中无法使用重载的属性, 这意味着当对一个重载的属性 使用empty时,重载魔术方法将不会被调用。 (译注:此特性在新版本已改变,英文手册未更新)
为避开此限制,可以将重载属性赋值到本地变量再使用empty。 先看 empty
empty($var) 返回逻辑值
empty(function()) 出现语法错误
empty('ss') 出现语法错误
可知 empty 之作用于变量对象的不可访问属性是指未声明或声明了但是受保护的属性
这个属性可以通过 __get 方法获取
也就是说
$object->overloading
实际执行的是
$object->__get('overloading')按 empty 推演就不能写作
empty($object->__get('overloading'))
因为是语法错
只能写作
$tmp = $object->__get('overloading');
empty($tmp);
这就是那段文字的含义但是这里有个问题
如果可访问的属性能用 empty
而不可访问的属性不能用 empty
那么就产生了混乱,而使使用者无所适从不知从哪个版本开始,php出现了变化
class T {
var $var;
function __get($name) {
return $param;
}
}
$p = new T;
var_dump(empty($p->var));
var_dump(empty($p->xxx));都将返回 boolean true
这样就同一起来了于是,用旧有的说明解释现在的表现,怎么都是说不通的可见,老外也不是什么好鸟