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

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

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

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

    __set.__get魔术方法: //文件名:Object.php <?phpnamespace IMooc;class Object{ protected $array = array(); ...

  2. 巧用PHP中__get()魔术方法

    PHP中的魔术方法有很多,这些魔术方法可以让PHP脚本在某些特定的情况下自动调用.比如 __construct() 每次实例化一个类都会先调用该方法进行初始化.这里我们讲一下__get() 魔术方法的 ...

  3. 126-PHP类__get()魔术方法

    <?php class ren{ //定义人类 //定义成员属性 private $name='Tom'; private $age=15; //定义__get()魔术方法 public fun ...

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

    一般来说,总是把类的属性定义为 private .这更符合现实的逻辑. 但是对属性的读取和赋值操作非常频繁的,因此在PHP中,预定义了两魔术方法 "__get()"用来获取私有成员属性值的,只有一个参 ...

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

    <?php class Ren{private $name;private $age;private $sex;function __set($name,$value){ if($name == ...

  6. PHP的那些魔术方法(一)

    在PHP中,有一堆魔术方法,服务于类和对象.PHP虽然也是纯种的面向对象语言,但是之前的PHP还真不是,所以有一些面向对象的标准实现并不完善,比如重载.但是,我们可以通过一些魔术方法来弥补,例如__c ...

  7. php魔术方法__get(),__set(),__isset()的使用

    1.魔术方法__get(),__set(),__isset()类: <?php /** * @purpose: 魔术方法 __get() , __set(), __isset() 的使用 * U ...

  8. 跟着百度学PHP[4]OOP面对对象编程-13-魔术方法__set(),__get(),__isset(),__unset()

    __set() 在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法) __get() 方法用于获取私有属性值.(在设置私 ...

  9. PHP中的常用魔术方法

    魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 php面向对象中,提供了这几个魔术方法,他们的特点都是 以双下划线__开头的 __construct()  构造方法 __destruct( ...

随机推荐

  1. R语言自带数据包

    向量 euro    #欧元汇率,长度为11,每个元素都有命名 landmasses    #48个陆地的面积,每个都有命名 precip    #长度为70的命名向量 rivers    #北美14 ...

  2. js一些题目

    假期在家,看到的,昨天看了下: 原文链接:http://wwwcqamin.duapp.com/?p=102#comment-7 请说出下面程序的输出结果 第一题: 1 2 3 4 5 6 7 8 9 ...

  3. QMessageBox中按钮的汉化

    方法一:直接添加汉语按钮: QMessageBox mess(QMessageBox::Question, "删除提示", "确认删除所选组件?", NULL) ...

  4. EasyUI combotree 使用技巧

    $('#areaName').combotree({ url: '../Ajax/Common.ashx?Method=GetCombotreeData', multiple: true, check ...

  5. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)

    转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm   这篇文章主要介绍了JS实现漂亮的窗口 ...

  6. hat linux下vnc的安装

    1.在系统文件下找到vnc的rpm包(检测是否安装vnc) 系统文件寻找方法 进入到根目录(可通过pwd确认当前目录,/则表示根目录) 根目录下有个一个media,进入此目录 media目录下有个一个 ...

  7. 分享一个快速的Json(反)序列化开源项目 Jil

    我们不缺少JSON的序列化库,但我们缺少一个性能非常好的库,这对于网站来说非常重要.今天我发现了Jil. 他是开源的代码: https://github.com/kevin-montrose/Jil ...

  8. 生JS实现jQuery的ready方法呢?下面是其中之一的做法:

    function ready(fn){ if(document.addEventListener){      //标准浏览器 document.addEventListener('DOMConten ...

  9. [Js]面向对象的选项卡实例

    中间过渡环节:把面向过程的程序,改写成面向对象的形式 <html xmlns="http://www.w3.org/1999/xhtml"><head>&l ...

  10. win7下python安装pyquery

    安装pyquery之前首先要明确一点,easyinstall 是一款python包管理器,类似于node的npm,用于安装python的扩展包,它安装的包是以*.egg的方式. 要安装pq需要经历以下 ...