• __set: 在给不可访问属性赋值时,__set() 会被调用。语法如下:
public void __set ( string $name , mixed $value )
  • __get: 读取不可访问属性的值时,__get() 会被调用。语法如下:
public mixed __get ( string $name )

说明: 参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。

示例代码如下:

<?php

class SportObject{                                          //类SportObject

private $type = ' ';                                        //私有变量$type

public function __get($name){                               //声明魔术方法__get()

        echo "调用__get方法\n";

        if(isset($this ->$name)){                               //判断变量是否被声明

            echo '变量'.$name.'的值为:'.$this -> $name.'<br>';

        }else{

            echo '变量'.$name.'未定义,初始化为0<br>';

            $this -> $name = 0;                             //如果未被声明,则对变量初始化

        }

    }

    public function __set($name, $value){                       //声明魔术方法__set()

        echo "调用__set方法\n";

        if(isset($this -> $name)){                              //判断变量是否定义

            $this -> $name = $value;

            echo '变量'.$name.'赋值为:'.$value.'<br>';

        }else{

            $this -> $name = $value;                            //如果未定义,继续对变量进行赋值

            echo '变量'.$name.'被初始化为:'.$value.'<br>';     //输出警告信息

        }

    }

    public function test()

    {

        echo $this->type;

    }

}

$MyComputer = new SportObject();                                //实例化对象$MyComputer

$MyComputer -> type = 'DIY';                                    //给变量赋值 

$MyComputer -> type;                                        //调用变量$type

$MyComputer -> cpu;                                        //调用变量$name

?>

代码解析:

  1. 调用 $MyComputer -> type = 'DIY'; 为type属性赋值,由于type属性是private,不能在类外部访问,所以会调用__set()魔术方法,首先判断if语句中的isset($this->$name),根据__set($name,$value)的语法,我们知道$name的值是type,$value的值是DIY,isset($this->$name)即是isset($this->type),前面提到type这个属性是private,但是在类内部是可以调用的, 所以if语句成立,执行下面代码:
$this->$name = $value;

echo '变量'.$name.'赋值为:'.$value.'<br>';
  1. 调用$MyComputer->type, 是读取type属性,同理,执行__get($name)方法。首先判断isset($this->$name),if语句成立,执行下面代码:
echo '变量'.$name.'的值为:'.$this -> $name.'<br>';

由于前面已经为$this->type赋值为DIY,所以直接输出。

  1. 调用$MyComputer -> cpu; 读取cpu这个不存在属性,调用__get($name)方法,首先判断if语句isset($this->$name),由于没有这个cup属性,所以执行else语句内容,代码如下:
echo '变量'.$name.'未定义,初始化为0<br>';

$this -> $name = 0;

在代码最后,调用了$this->$name = 0; 即为不存在的属性赋值,所以会再次调用__set($name)方法。同样是判断if语句,这时if语句为false,执行else中的代码如下:

$this -> $name = $value;                           

echo '变量'.$name.'被初始化为:'.$value.'<br>';

PHP魔术法__set和__get的更多相关文章

  1. __set()与__get() 魔术方法

    在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用:而私有的(private)和受保护的(protected),在类外不 ...

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

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

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

    __set()与__get() 当一个类里面,属性被设置为私有属性时,这个属性是不能在外部被访问的.那么当我们又想在外部访问时该怎么办呢,我们可以用方法来实现.举例如下: 1 class Test 2 ...

  4. PHP中 对象自动调用的方法:__set()、__get()、__tostring()

    总结: (1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部 执行,返回我们传 ...

  5. PHP面向对象.__set(),__get(),__isset(),__unset()四个方法的

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...

  6. 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...

  7. PHP面向对象(OOP):__set(),__get(),__isset(),__unset()四个方法的应用

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...

  8. PHP面向对象(OOP)编程完全教程:10.__set(),__get(),__isset(),__unset()四个方法的应用

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...

  9. 详解PHP的__set()、__get()、__isset()、unset()四个方法

    PHP系统中给我们提供了很多预定义的方法,这些方法大部分都需要在类中声明,只有需要时才添加到类中.它们的作用.方法名称.使用的参数列表和返回值都是在PHP中预定好的,并且都是以两个下划线开始的方法名称 ...

随机推荐

  1. POJ 2217 Secretary

    Secretary Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID:  ...

  2. mongodb replica set 添加/删除节点方法--http://www.ii123.com/jc/bc/bczh/258948.html

    replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点  代码如下   re ...

  3. Codeforces Round #240 (Div. 2) C Mashmokh and Numbers

    , a2, ..., an such that his boss will score exactly k points. Also Mashmokh can't memorize too huge ...

  4. zoj 3812 状压dp

    转载:http://blog.csdn.net/qian99/article/details/39138329 题意:给出n个物品,每个物品有两种属性Wi,Ti,有q组查询,每组查询要求在n个物品中选 ...

  5. R - Milking Time DP

    Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...

  6. [bzoj1040][ZJOI2007]骑士(环套树DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1040 分析:第一感觉肯定是树形DP,但可惜不是树.仔细分析,这个图很特殊,每个联通块肯 ...

  7. 中文命名之Hibernate 5演示 - 使用注解(annotation)而非xml定义映射

    前文中文编程:中文命名之Hibernate 4+MySQL演示最后留下了个Hibernate 5之后出现的问题, 于是在Hibernate社区提交了报告: Seemingly regression s ...

  8. mysql 中间件

    http://f.dataguru.cn/thread-543718-1-1.html mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持 ...

  9. POJ 2367:Genealogical tree(拓扑排序)

    Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2738 Accepted: 1838 Spe ...

  10. Api基类

    基类 class BaseController extends Controller{ public $outData = ['code'=>0,'msg'=>'ok']; public ...