本帖最后由 xing199007 于 2012-11-22 20:49:28 编辑

解决方案 »

  1.   

    现补充一下。因为我不知道手册那段话到底要说什么,翻译的可能不太好。overloaded properties 也可以翻译成重载后的属性。(我上面翻译的是被重载的属性)实在不知道他说的是什么意思,不知道翻译成什么好。
      

  2.   

    考托福啊?1.动词过去时态做形容词用,译为
    重载的属性2.另一个关键的英语你没翻译好是——
    echo、empty、isset……这些不是函数,而是语言结构echo(某重载的属性)——这个是无效的,得不到你想要的结果这样大致能理解了吧?
      

  3.   

    第一。你看我二楼的话了吗?第二。我什么时候说那些事函数了?我说的明明是语言结构。第三 echo一个重载的属性是无效的?得不到想要的结果?要你那么说,还要__get()干什么用!再说了,我就在__get()里返回我想要的结果不行吗?
      

  4.   

    半夜起来看有没有人能解答。结果看到了楼上。我拜托,知道你们想帮忙。不过不要自以为是的连看完都不看完好不好?我不用考托福。我新加坡呆了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的初衷。但是只作为一个例子来讲,怎么不是我想要的结果?
      

  5.   

    纠正一下,5楼打错了,我针对的是楼上的楼上,就是三楼。而且代码有打错的地方,第七行换成return $this->$name; 才对。一着急,打错了。
      

  6.   

    现在的人火气真大……一天内遇到三个example#1 展示的很清楚了
    不跟有为青年吵,再过五年都是你们的天下,我撤退 
      

  7.   

    这段话是有点问题, 我试了下面的代码, 明显empty也call了魔术方法,<?phpclass Test {
    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
      

  8.   


    <?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
      

  9.   

    我不懂英文,所以也不看英文手册,不知道原文是怎样的。
    中文手册中有这样的说明
    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
    这样就同一起来了于是,用旧有的说明解释现在的表现,怎么都是说不通的可见,老外也不是什么好鸟