魔术方法__set()和__get()是不是一定要声明为public?我的声明为private时,在类外面调用,浏览器提示为“要将__set()和__get()设为public”,可是很多资料书上都可以声明为private啊?

解决方案 »

  1.   

    是的,一定要声明为public,只用这要,才能在外部访问很多资料书上都可以声明为private啊
    请永远的删除这些资料,因为他是在骗你!
      

  2.   

    最近正好看魔术方法这章呢.. 我只知道__set()和__get()是针对private变量的取值赋值来定义的..由于是系统自己调用  所以我觉得魔术变量是不受访问符限制的吧 .. 所以自己本身一般不会来声明为public或者private 但是如果你在类外自己调用的话 应该会受到访问符限制吧 标记一下 一会儿回来看正确答案..
      

  3.   

    是不是默认的就已经是public了? 还真没试过自己在类外调用魔术方法的..不是应该系统调用吗? 自己调用这有意义吗?
      

  4.   

    默認是public的,這些方法是對象自己調用的,当設置或读取一個不存在的属性時,这两个方法会自动调用。
      

  5.   

    class T {
      function __set($name, $value) {
        echo "你试图对属性 $name 赋值为 $value";
      }
      function __get($name) {
        echo "属性 $name 尚不存在";
      }
    }$p = new T;
    $p->aaa = 123;
    $p->aaa;
      

  6.   

    <?phpclass Person{
         private $name;
     private $sex;
     private $age;
     
     
     function __construct($name="",$sex="男",$age=9){
     $this->name=$name;
     $this->sex=$sex;
     $this->age=$age;
     }
     private function __set($propertyName,$propertyValue){
     
     if($propertyName=="sex"){
         if(!(propertyValue=="男")||(propertyValue=="女"))
                 return;
     }
      
      if($propertyName=="age"){
      if(($propertyValue>150)||($propertyValue<0))
                     return;
      }
      
      $this->propertyName=$propertyValue;
      
      }             
      
      public function say(){
      echo "My name is ".$this->name.",Sex:".$this->sex.",Age:".$this->age."<br>.";
      }
      
    }$person1=new Person("zhangsan","男",20);
    $person1->name="李四";
    $person1->sex="女";
    $person1->age=80;
    $person1->sex="保密";
    $person1->age=800;
    $person1->say();?>
      

  7.   

    手册上写得很明确:
    http://www.php.net/manual/zh/language.oop5.overloading.php"所有的重载方法都必须被声明为public。"