在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用;而私有的(private)和受保护的(protected),在类外不能直接赋值和使用,必须通过在类当中定义成员函数对该属性的成员变量进行操作,今天要提的__set()和__get()魔术方法就是针对私有成员进行赋值和获取值操作。
具体的方法可以参考下面的示例代码:
首先,不用魔术方法进行操作,直接定义函数:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php class Person{ //下面是人的成员属性,都是封装的私有成员 private $name; //人的名子 private $sex; //人的性别 private $age; //人的年龄 //定义三个成员函数,分别用于对name,sex,age进行赋值。 public function setName($name){ $this->name=$name; } public function setSex($sex){ $this->sex=$sex; } public function setAge($age){ $this->age=$age; } //定义三个成员函数,分别用于获取name,sex,age的值。 public function getName(){ return $this->name; } public function getSex(){ return $this->sex; } public function getAge(){ return $this->age; } } $p=new Person(); //通过成员函数,分别赋值 $p->setName("张三"); $p->setSex("男"); $p->setAge(20); //通过成员函数,分别输出各值 echo "姓名:".$p->getName()."<br>"; echo "性别:".$p->getSex()."<br>"; echo "年龄:".$p->getAge()."<br>"; ?> </body> </html>
然后下面一段代码是运用__set()、__get()方法实现相同的功能:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php class Person{ //下面是人的成员属性,都是封装的私有成员 private $name; //人的名子 private $sex; //人的性别 private $age; //人的年龄 //__get()方法用来获取私有属性 private function __get($property_name){ echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; if(isset($this->$property_name)){ return($this->$property_name); } else{ return(NULL); } } //__set()方法用来设置私有属性 private function __set($property_name, $value){ echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; $this->$property_name = $value; } } $p1=newPerson(); //直接为私有属性赋值的操作,会自动调用__set()方法进行赋值 $p1->name="张三"; $p1->sex="男"; $p1->age=20; //直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值 echo "姓名:".$p1->name."<br>"; echo "性别:".$p1->sex."<br>"; echo "年龄:".$p1->age."<br>"; ?> </body> </html>
通过对比两个代码可以发现,用了魔术方法后,在类外可以直接对私有成员进行赋值或者取值。
时间: 2024-10-29 10:52:43