__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>

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

时间: 2024-10-29 10:52:43

__set()与__get() 魔术方法的相关文章

PHP常用魔术方法(__set、__get魔术方法:)

__set.__get魔术方法: //文件名:Object.php <?phpnamespace IMooc;class Object{ protected $array = array(); function __set($name, $value)//set魔术方法 { var_dump(__METHOD__);//输出当前方法 $this->array[$name]=$value;//$name=title,$value="哎哟喂" } function __get(

__set(),__get() 魔术方法示例

<?php class Ren{private $name;private $age;private $sex;function __set($name,$value){ if($name == "age") { if($value < 50 && $value > 10) { $this->$name = $value; } } else { $this->$name = $value; }}function __get($name){

__get().__set.__isset,__unset魔术方法

一般来说,总是把类的属性定义为 private .这更符合现实的逻辑. 但是对属性的读取和赋值操作非常频繁的,因此在PHP中,预定义了两魔术方法 "__get()"用来获取私有成员属性值的,只有一个参数获取的属性名称. "__set()"用来为私有属性设值的,有两个参数,第一参数为属性名,第二个属性值. (用__set,不用我们手工去调用,它也可以做成私有的的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上了.) 以及检查属性的方法"__isset()"和

PHP中的面向对象OOP中的魔术方法

一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在new一个新对象时自动调用此函数 二.PHP中都有那些魔术方法,以及它们的作用:1.__construct():构造函数,new对象时自动调用 eg: class Person{ public $name; public $age; function __construct($name,$age){ $

php 魔术方法学习笔记

__get()  __set()    __isset()   __unset __call   __callstatic __call是调用不可见(不存在或者没权限)的方法时,自动调用. $lisi->say(1,2,3)   对象中并不存在say 方法   __call("say",array(1,2,3))运行 __get()用来获取私有成员的属性值,有一个参数,参数传入你要获取的私有成员的属性名称,返回的是获取的值.该方法不用我们手工去调用,只需要封装在类里面就好了.如果

php面向对象类中常用的魔术方法

php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct() class construct{ public function __construct(){ $this->var = "this is var"; } } class con2 extends construct{ public function __construct(){ $

OOP魔术方法

__get() 调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用, 并且自动传参,参数值是属性名 __set() 为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用,自动传2个参数,属性 属性值 __isset 当isset()判断对象不可见的属性时(protected /private/不存在的属性)会引发__isset()来执行 __unset() 当用unset销毁对象的不可见属性时,会引发__unset __call($method, $a

PHP面向对象的魔术方法

<?php/** * Created by PhpStorm. * User: fu * Date: 2017/7/19 * Time: 9:41 */ class Person{ protected $name; private $age; private $mobile; function __construct($name, $age) { $this->name = $name; $this->age = $age; } /** * 测试使用的不能直接访问的函数 * @param

PHP 魔术方法之__set__get__unset__isset

[php] view plain copy print? <?php /*** 魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 PHP面向对象中,提供了这几个魔术方法, 他们的特点 都是以双下划线__开头的 __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke