__set()与__get() 魔术方法

在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(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>

 通过对比两个代码可以发现,用了魔术方法后,在类外可以直接对私有成员进行赋值或者取值。

posted @ 2016-07-30 14:03  寻觅beyond  阅读(523)  评论(0编辑  收藏  举报
返回顶部