如何在成员函数 __set()中,判断某个属性是否是类中存在的呢?举例如下:
我在这个类中,age是已经存在的属性,而weight是不存在的属性,我不知如何在 __set()函数中进行判断,
比如对象名为 $a,那么$a->age,与$a->weight,两种赋值是不同的,我就是不知如何在 __set()函数中进行区分?
<?php
class Person{
//下面是人的成员属性,都是封装的私有成员
public  $name;        //人的名字
public $sex;         //人的性别
private $age;         //人的年龄//__get()方法用来获取私有属性
public function __get($property_name){
echo "*******__get()函数被调用**********<br>";
  if(isset($this->$property_name))
  {
return($this->$property_name);
  }else{
  return('没有这个属性');
  }
}
//__set()方法用来设置私有属性
public function __set($property_name, $value){
  echo "************__set()函数被调用************<br>";
  if(isset($this->$property_name))
{
echo "这是存在的属性,直接赋值<br/>";
}
else
{
echo "这是根本没有存在的属性,先创建再赋值<br/>";
}
  $this->$property_name = $value;
}
}$p1=new Person();echo "----下面为age赋值(这是私有的)----<br/>";
$p1->age=20;
echo "----下面为体重weight赋值(这是不存在的)----<br/>";
$p1->weight=120;
echo "----下面输出age----<br/>";
echo "年龄:".$p1->age."<br>";
echo "----下面输出体重weight----<br/>";
echo $p1->weight . "<br/>";echo "-----下面输出没有过的属性------<br/>";
echo "没有的属性:" . $p1->学历 . "<br>";?>
以上代码执行后显示如下:----下面为age赋值(这是私有的)----
************__set()函数被调用************
这是根本没有存在的属性,先创建再赋值
----下面为体重weight赋值(这是不存在的)----
************__set()函数被调用************
这是根本没有存在的属性,先创建再赋值
----下面输出age----
*******__get()函数被调用**********
年龄:20
----下面输出体重weight----
120
-----下面输出没有过的属性------
*******__get()函数被调用**********
没有的属性:没有这个属性

解决方案 »

  1.   

    你是指 private $age 吧?
    你对 $age 赋初值就没有问题了
      

  2.   

    __set()__get()等这些方法到底在什么时候被执行??他们是自动的。
    你好好查查!
    class ClassName extends abstractClass{

    private $private_var = array(); public $public_var; protected $protected_var; private static  $static_var  = 0;
    const VERSION = "1.0"; //ClassName::VERSION

    function __construct(){
    //构造函数,实例化对象时执行
    //$Object = new ClassName();

    self::$static_var++;
    }

    function __destruct(){
    //将在对象被销毁前调用这个函数. 它称为析构函数.
    //$Object = NULL;
    self::$static_var--;
    }

    static function staticFunction() {
    //ClassName::staticFunction()
      return self::$static_var;
    }

    function __clone(){ 
    //克隆:将建立一个与原对象拥有相同属性和方法的对象. 如果你想在克隆时改变默认的内容,你要在__clone中覆写(属性或方法)
    //同时包含this和that指针(that指向被复制的对象). 
    //$cloneObject = $Object->__clone();
    $this->name = "Clone of ".$that->name; 
    $this->id =   self::$nextSerial; 


    function __get($var_name){
    //当实例化对象后,调用了不存在的对象属性时执行(取值)
    //echo $Object->not_var
    if(isset($this->private_var[$var_name])) { 
    return($this->private_var[$var_name]); 
    }else{ 
    return(NULL); 
    }
    }

    function __set($var_name){
    //当实例化对象后,调用了不存在的对象属性时执行(赋值)
    //$Object->not_var1 = "1";
    if(isset($this->private_var[$var_name])) { 
    return($this->private_var[$var_name]); 
    }else{ 
    return(NULL); 
    }
    }

    function __call($function_name, $args){
    //当实例化对象后,调用了不存在的对象方法时执行
    //$Object->not_func($arg1,$arg2);
    print("Invoking $function_name()<br>\n"); 
    print("Arguments: "); 
    print_r($args); 
    return(TRUE); 
    }

    function __sleep(){
    //串行化时执行
    //只串行化public_var  
    //$S = serialize($Object); 
    return(array("public_var")); 
    }

    function __wakeup(){ 
    //反串行化时执行
    //$U = unserialize($S);
    $this->protected_var = array(); 
    }