• __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. UVALive 6510 Stickers

    Stickers Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ...

  2. nyoj 19 擅长排列的小明(深搜,next_permutation)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  3. 初次使用Let's encrypt

    wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks ...

  4. jquery ajax报Uncaught TypeError :Illegal invocation

    使用jquery ajax异步提交的时候报Uncaught TypeError :Illegal invocation错误,报错信息如图: 上网查了一下jquery的这个错误,导致这个错误的原因有俩点 ...

  5. 你的ExcelUtil简单、高效、易扩展吗

    你的ExcelUtil简单.高效.易扩展吗 Author: Dorae Date: 2018年10月23日12:30:15 转载请注明出处 一.背景 最近接到了和Excel导出相关的需求,但是: 项目 ...

  6. [BZOJ1045][HAOI2008]糖果传递(数学分析)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1045 分析:均分纸牌的环状版本. 先看线性的版本: 设f[i]表示第I位从第i+1位得 ...

  7. installshield中的installscript编程

    上一篇说道了InstallShield高速建立一个打包程序,如今说说InstallShield里面的installscript脚本. 该文属于个人理解.參考一些相关文章. 相关资料下载地址:http: ...

  8. BC #62 div1 02

    /* 数位DP题,设dp[n][k][j]为前n位最后一位是k时mod为j的个数.操作都相同,可以使用矩阵加速.本来对于每一位是7*10,可以把它压向一个向量. 加速矩阵为70*70,再加一维计算前缀 ...

  9. 使用Tomcat的一些经验和心得

    如今将使用Tomcat的一些经验和心得写到这里.作为记录和备忘.假设有朋友看到,也请指教. 1.首先是Tomcat的获取和安装. 获取当然得上Apache的官方站点下载,开源免费.并且带宽也足够.下载 ...

  10. LeetCode 438. Find All Anagrams in a String (在字符串中找到所有的变位词)

    Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...