<?php
error_reporting(E_ALL | E_STRICT);class mycls{

 private $p=1;
 
 
   /**  被重载的数据保存在此  */
    private $data = array();
 
  
  function func()
  {
   echo "none static";
   }
/* public function __set($name,$value) 
    {
        echo "Setting '$name' to '$value'<br>\n";
        $this->$name = $value;
    }  */
 
 public function __get($name)
   {
   echo "Getting '$name' <br>\n";
       return $this->$name;

   }
 }
$my=new mycls;$my->a=10;   // 
echo $my->a;
?>

解决方案 »

  1.   

    看以上代码,为什么 echo $my->a 时候没有 调用 __get ?重载里 不是说访问没有定义的属性会调用 __get 吗?
      

  2.   

    说错了,$a定义了,为何没调用 __get ?
      

  3.   

    你有 $my->a=10;
    当然就不会调用 __get 啦
      

  4.   

    手册说:"在给未定义的变量赋值时,__set() 会被调用。读取未定义的变量的值时,__get() 会被调用。"
    如果你把代码里__set 那段注释去掉,就会发现 __set会被调用,偏偏就是 __get 不会被调用,为何?
      

  5.   

    写成这样就都有了error_reporting(E_ALL | E_STRICT);class mycls{
      private $p=1;
     
      /** 被重载的数据保存在此 */
      private $data = array();
      
      function func()
      {
        echo "none static";
      }  public function __set($name,$value)  
      {
        echo "Setting '$name' to '$value'<br>\n";
        $this->data[$name] = $value;
      } 
      
      public function __get($name)
      {
        echo "Getting '$name' <br>\n";
        return $this->data[$name];
      }
    }$my=new mycls;$my->a=10; //  echo $my->a;
      

  6.   

    $my=new mycls;echo $my->a;//直接输出就会被调用啦没有echo语句,直接赋值,就会调用__set但你的代码中注销掉了
      

  7.   

    我基本弄明白了,但是又有一个疑问,看这里 http://www.php.net/manual/zh/language.oop5.overloading.php
     /**  只有从类外部访问这个属性时,重载才会发生 */
        private $hidden = 2;这个:echo "Privates not visible outside of class, so __get() is used...\n";
    echo $obj->hidden . "\n";
    为什么会提示"没有定义的"变量?类里面明明不是定义了(虽然是 private) 吗?
      

  8.   


    我明白了,这个是“不可见”的,所以会调用 __get
      

  9.   


    对头,__get公有方法访问私有属性。