php的魔法方法__set()与__get()

Tags: PHP

我们先来看看官方的文档如何定义他们的:

public void __set(string $name, mixed $value);

public mixed __get(string $name);

在给不可访问的属性赋值时,__set()会被调用。

读取不可访问的属性的值时,__get()会被调用。

在实际的应用中,经常需要将一些属性设置为私有的属性,不能为外部随便的更改,这个时候要更改不可见的属性的时候可以通过:

  1. 创建一个专门用于设置与读取值得setter,getter。
  2. 使用php的魔法方法__set(), __get()便可以方便的设置与读取属性。

有代码才有真相嘛:

<?php

/** setget.php **/

/**
* 测试__set()和__get()的作用于用法
*/
class Person { private $name;
private $age = 20; // 故意设置为public
public $sex = 'girl'; function __construct() {
} public function __set($name, $value) {
echo 'setting ' . $name . ' to ' . $value . '<br />';
$this->$name = $value;
} public function __get($name) {
echo 'getting ' . $name . ' ';
return isset($this->$name) ? $this->$name : null;
}
} echo '<pre>'; $person = new Person(); $person->name = 'tingyugetc';
echo $person->name . '<br />'; $person->sex = 'boy';
echo $person->sex . '<br />'; $person->age = 21;
echo $person->age . '<br />'; $person->city = '南京';
echo $person->city . '<br />'; print_r($person); echo 'unset<br />'; unset($person->city); //不可以对不可见属性直接调用unset,需要重载__unset()才可以
//PHP Fatal error: Cannot access private property Person::$name in setget.php on line 47
// unset($person->name); print_r($person); /**
* 测试不使用__set(),__get()时访问不可见的属性
*/
class Student { private $name;
public $core; function __construct() { } } $student = new Student(); // 不可以直接访问不可见属性
// PHP Fatal error: Cannot access private property Student::$name in setget.php on line 66
// $student->name = 'tingyugetc';
// echo $student->name . '<br />'; $student->core = 100;
echo $student->core . '<br />'; print_r($student); ?>

以上代码的输出结果为:

        此处可见对于private属性的访问调用了__set,__get
setting name to tingyugetc
getting name tingyugetc
此处可见对于public属性的访问没有调用
boy
setting age to 21
getting age 21
此处可见对于类中没有定义的属性在set的时候会调用__set()
然而在读取的时候并不调用__get
对象新创建的属性默认为public
setting city to 南京
南京
Person Object
(
[name:Person:private] => tingyugetc
[age:Person:private] => 21
[sex] => boy
[city] => 南京
)
unset
Person Object
(
[name:Person:private] => tingyugetc
[age:Person:private] => 21
[sex] => boy
)
100
Student Object
(
[name:Student:private] =>
[core] => 100
)

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

    __SET  设置一个不可访问的属性的时候 调用_set方法 __GET 获取一个不可访问的属性的时候  调用_get 方法 <?php class stu{ private $a; priva ...

  3. PHP 魔术方法__set() __get() 方法详解

    __set() is run when writing data to inaccessible properties. __get() is utilized for reading data fr ...

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

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

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

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

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

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

  7. PHP面向对象魔术方法之__get 和 __set函数

    l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...

  8. python之魔法方法介绍

    1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...

  9. python_面向对象魔法方法指南

    原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...

随机推荐

  1. HTML5学习笔记

    参考资料:http://www.runoob.com/html/html-tutorial.html 1.html5声明.将此html文档标记为html5文档 <!DOCTYPE html> ...

  2. 从零开始学 Java - CentOS 下 Nginx + Tomcat 配置负载均衡

    为什么现在有非常多的聪明人都在致力于互联网? 最近在读埃隆·马斯克传记,他说「我认为现在有非常多的聪明人都在致力于互联网」. 仔细一想,好像真的是这样的. 我问了自己一个问题:如果你不敲代码了,你能做 ...

  3. 对,这是http处理层

    16年2月的一次代码重构,面对如此肮脏丑陋的代码我困在了座椅上整整一天的时间. 底层用java写的api接口,通过http去调用,在之上是用php写的业务逻辑层,重构的代码,正是php这一层. pub ...

  4. iOS 支付宝的使用

    支付宝相关资源下载地址:支付宝开放平台  在移动支付功能处下载. 一.使用官方的Demo 需要配置基本信息: 打开“APViewController.m”文件,对以下三个参数进行编辑. 二.集成支付宝 ...

  5. SharePoint 2013 CSOM creat post in NewsFeed Access Denied

    现象 在用CSOM创建新闻源时候,报错:无访问权限 解决办法 value="true" 改为 value="false" <appSettings> ...

  6. IOS客户端实现RSA加密

    在IOS的app登陆模块,用户名和密码如果直接传给后台服务器,很容易被截获并伪造网络请求, 如果利用RSA算法在每个客户端利用公钥解密,服务器端进行私钥解密,即使截获了密码也是无法解密的 在这里只介绍 ...

  7. IOS开发基础知识--碎片14

    1:ZIP文件压缩跟解压,使用ZipArchive 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilen ...

  8. OC 面试问题汇总

    OC 问题汇总: 1. 你如何理解 iOS 内存管理   1. new alloc copy retain这些对象我们都要主动的release或者 autorelease   2. 如果是类方法创建的 ...

  9. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  10. Windows操作系统优化(Win7版) - 进阶者系列 - 学习者系列文章

    Windows系统优化是个永恒的话题.在操作系统的打包制作方面更是有得一拼.前面提到的龙帝国社区的XP系统就是一个典型的例子,打包好的系统就已经是经过优化的,使用者无需再使用优化工具进行处理.下面就对 ...