__set() is run when writing data to inaccessible properties.

__get() is utilized for reading data from inaccessible properties.

究竟用中文怎么翻译呢? inaccessible :n. 难达到;难接近;无法理解。

有代码有真相:

<?php
    error_reporting(E_ALL);
    class stu{
        private $a;
        private $b = 0;
        public $c;
        public $d = 0;
        //这里的 private 可以用 protected public 替代
        private function __get($name) {
            return 123;
        }
        //这里的 private 也可以用 protected public 替代
        private function __set($name, $value) {
            echo "This is set function";
        }
    }
    $s = new stu();
    var_dump($s->a); //output: 123
    var_dump($s->b); //output: 123
    var_dump($s->c); //output: null
    var_dump($s->d); //output: 0
    var_dump($s->e); //output: 123
    $s->a = 3; //output: This is set function
    $s->c = 3; //no output
    $s->f = 3; //output: This is set function
?>

结果:

如果没有__get方法,执行 var_dump($s->a) var_dump($s->b) 会有致命的错误

如果没有__get方法,执行 var_dump($s->e) 会有一个notice,提示没有定义属性 $e

总结:

1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用

2. 向一个难以访问的属性赋值的时候 __set() 方法被调用

3. 难以访问包括:(1)私有属性,(2)没有初始化的属性

4. __isset() __unset() 也类似

PHP 魔术方法__set() __get() 方法详解的更多相关文章

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

    a); //output: 123 var_dump($s->b); //output: 123 var_dump($s->c); //output: null var_dump($s-& ...

  2. PHP的魔法方法__set() __get()

    php的魔法方法__set()与__get() Tags: PHP 我们先来看看官方的文档如何定义他们的: public void __set(string $name, mixed $value); ...

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

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

  4. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  5. 加密方法与HTTPS 原理详解

    一:加密方法: 1,对称加密 AES,3DES,DES等,适合做大量数据或数据文件的加解密. 2,非对称加密 如RSA,Rabin.公钥加密,私钥解密.对大数据量进行加解密时性能较低. 二:https ...

  6. jquery ajax 方法及各参数详解

    1.$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息. 参数列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type ...

  7. Java精通并发-wait与notify方法案例剖析与详解

    在上一节中对Object的wait.notify.notifyAll方法进行了总结,这次举一个具体案例来进行巩固,题目如下: 编写一个多线程程序,实现这样的一个目标: 1.存在一个对象,该对象有一个i ...

  8. Java使用wait() notify()方法操作共享资源详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方 ...

  9. 并发编程补充--方法interrupted、isinterrupted详解

    并发编程 interrupted()源码 /** * Tests whether the current thread has been interrupted. The * <i>int ...

随机推荐

  1. Spring 特点

    IoC:豆浆和打针的例子.一个是主动的,一个是被动的.比如在spring里面我们需要对象了,提出需求,spring容器会把对象给你.(这就是IoC) AOP:

  2. Notepad++ 代码格式化

    在阅读别人的代码时偶尔会遇到格式很乱,阅读起来很费劲的情况,若手动改,很容易出错且很费时间,这时可以借助一些专业的编辑器来格式化代码,NotePad++是一个轻量级的代码编辑器,占用内存少,运行速度快 ...

  3. 怎么自动响应richTextBox超级链接单击click事件

    如上图所示,怎么自动响应richTextBox超级链接单击click事件?步骤如下: 1. 增加 richTextBox1_LinkClicked 事件: 2.  编辑事件内容如下: private ...

  4. C++基础学习2:命名空间

    C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace. 科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地 ...

  5. CF1076D Edge Deletion 最短路径树+bfs

    题目描述 You are given an undirected connected weighted graph consisting of n n n vertices and m m m edg ...

  6. Python利用百度地图api批量获取地址经纬度

    1.pip安装xlrd,xlwt,requests模块. 2.在工程目录处放置地点Excel文件. python2.7.13代码: #coding:utf-8 import xlrd import x ...

  7. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用

    public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); } ...

  8. Hibernate JPA 如何使用SQL文直接查询

    对于复杂SQL,可以直接调用native sql来是实现 public List<Partner> findPartners() { List<Partner> partner ...

  9. springmvc怎么重定向

    转载大神: https://blog.csdn.net/wabiaozia/article/details/50252661

  10. Juniper SRX550防火墙web页面CPU达到100%的故障解决办法

    Juniper SRX550防火墙web页面CPU达到100%的故障解决办法 利用telnet远程连接主机,对web页面注销重新登录即可,在配置中输入命令:run restart web-manage ...