l 基本的介绍

(1) 当我们去使用不可以访问的属性时,系统就会调用__get方法.

(2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性)

(3) 当程序员去给不可以访问的属性直接赋值,系统就会调用__set方法

l 举例说明

需求是: 如果对象有一个成员变量是private、protectd的,我希望在在类的外部通过 : $对象名->变量名的方式来赋值和取值,怎么办?

代码如下

<?php
header('content-type:text/html;charset=utf-8');
//__get 和 __set class Monkey{
public $name;
protected $food;
public function __construct($name, $food){
$this->name = $name;
$this->food = $food;
} //魔术方法 __get
//1. 魔术方法名字是固定,系统提供
//2. $pro_name 是形式参数,表示属性名
public function __get($pro_name){ // echo '<br> pro_name ' . $pro_name; //做一个判断
if(property_exists($this, $pro_name)){
return $this->$pro_name;
}else{
return '没有该属性,无法返回!';
} } //魔术方法 __set
//1. 魔术方法名字是固定,系统提供
//2. $pro_name 是形式参数,表示属性名, $pro_val 是属性值
public function __set($pro_name, $pro_val){ //echo '<br> $pro_name = ' . $pro_name . ' pro_val ' . $pro_val;
//判断属性是否存在
if(property_exists($this, $pro_name)){
$this->$pro_name = $pro_val;
}else{
return '属性不存在,无法赋值';
}
} } //创建对象
$monkey1 = new Monkey('妖猴', '小孩'); echo '<br> 猴子名字是 ' . $monkey1->name; //需求
//因为 food是不可访问的属性(protected) echo '<br> 猴子喜欢吃 ' . $monkey1->food; //修改猴子的名字和食物
$monkey1->name = '猴妖';
//在默认情况下,不能直接给一个protected属性赋值, 会触发
//__set魔术方法.
$monkey1->food = '桃子'; echo '<br> 新的值是 <br>';
echo '<br> 猴子名字是 ' . $monkey1->name; //需求:
echo '<br> 猴子喜欢吃 ' . $monkey1->food;

PHP面向对象魔术方法之__get 和 __set函数的更多相关文章

  1. PHP面向对象-----魔术方法

    PHP面向对象-----魔术方法 __get($name)--触发时机:当调用一个不访问的成员属性的时候,会自动触发,可以利用这个方法来完成对不可调用的属性进行调用,但是不能设置值 ___set($n ...

  2. PHP类中的__get()和__set函数到底有什么用

    PHP类中的__get()和__set函数到底有什么用 一.总结 一句话总结:当试图获取一个不可达变量时,类会自动调用__get.同样的,当试图设置一个不可达变量时,类会自动调用__set.在网站中, ...

  3. PHP类中的__get()和__set函数到底有什么用?

    当试图获取一个不可达变量时,类会自动调用__get. 同样的,当试图设置一个不可达变量时,类会自动调用__set. 在网站中,这两个并不是什么非用不可的函数.   例如: Class Test {   ...

  4. PHP面向对象魔术方法之__call函数

    l 基本介绍: (1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用. (2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 p ...

  5. PHP面向对象魔术方法之__toString函数

    l 基本介绍: 当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法. <?php header('content-type:text/html;charset=utf- ...

  6. PHP面向对象魔术方法之__clone函数

    l 基本介绍 : 当我们需要将一个对象完全的赋值一份, 保证两个对象的属性和属性值一样,但是他们的数据库空间独立,则可以使用对象克隆. <?php header('content-type:te ...

  7. PHP面向对象魔术方法基本了解

    简单介绍 (1) 魔术方法都是系统提供,程序员使用即可. (2) 所有的魔术方法,前面都是以  __ 开头的 _是两个下划线. (3) 我们在自定义函数时,就不要使用 __开头了. (4) 魔术方法是 ...

  8. PHP中的面向对象魔术方法大全

    1.__construct  构造方法 2.__destruct  析构方法 3.__get 获取成员值 4.__set 设定成员值 5.__isset 判断成员值 6.__unset unset成员 ...

  9. python面向对象魔术方法补充

    一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 per ...

随机推荐

  1. mysql中重复数据只取条

    select * from table_a where id in (select min(id) from table_a group by a) )) SUBSTRING_INDEX(cids,' ...

  2. Python基础知识之5——函数基础

    函数 函数是一个独立且封闭完成特定功能的代码块,可以在任何地方被调用.Python内置了很多函数,我们可以直接调用,使用的时候,先查询下Python的官方文档即可: http://docs.pytho ...

  3. Algo: Majority Element

    Approach #1 Brute Force Intuition    We can exhaust the search space in quadratic time by checking w ...

  4. C++相对路径和绝对路径

    学习备忘 转自:http://www.cnblogs.com/vranger/p/3820783.html 电脑硬盘E盘下,建文件夹“test”,"test"下建立子文件夹“fil ...

  5. jquery实现文字由下到上循环滚动的实例代码

    <div id="oDiv"> <ul id="oUl"> <li>第1个li元素</li> <li> ...

  6. Nlog 日志框架简单教程

    安装 Nuget获取 配置寻找 会自动寻找在应用程序目录下的NLog.config(大小写敏感) 如何配置config <?xml version="1.0" encodin ...

  7. spring boot项目开发中遇到问题,持续更新

    1.JPA中EntityManager不能执行建表语句,提示要加事务Error:javax.persistence.TransactionRequiredException: Executing an ...

  8. Installer - Eclipse配置Data Source Explorer

    一.配置Oracle数据库连接 1.打开配置窗口 在[window]菜单中的[show windows]选择[other],在弹出的窗口中选择[Data Source Explorer]进行数据数据库 ...

  9. Linux 中执行Shell 脚本的方式(三种方法)

    Shell 脚本的执行方式通常有如下三种: (1)bash script-name 或者 sh script-name:(2)path/script-name或者./script-name:(3)so ...

  10. 一些关于Hibernate延迟加载的误区

    最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写 些东东在这里,希望对大家有所帮助. 首先是第一个误区:延迟加 ...