如何在成员函数 __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()函数被调用**********
没有的属性:没有这个属性
我在这个类中,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()函数被调用**********
没有的属性:没有这个属性
你对 $age 赋初值就没有问题了
你好好查查!
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();
}