PHP的魔法方法__set() __get()
php的魔法方法__set()与__get()
Tags: PHP
我们先来看看官方的文档如何定义他们的:
public void __set(string $name, mixed $value);
public mixed __get(string $name);
在给不可访问的属性赋值时,__set()会被调用。
读取不可访问的属性的值时,__get()会被调用。
在实际的应用中,经常需要将一些属性设置为私有的属性,不能为外部随便的更改,这个时候要更改不可见的属性的时候可以通过:
- 创建一个专门用于设置与读取值得setter,getter。
- 使用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()的更多相关文章
- PHP 魔术方法__set() __get() 方法
a); //output: 123 var_dump($s->b); //output: 123 var_dump($s->c); //output: null var_dump($s-& ...
- php魔术方法__SET __GET
__SET 设置一个不可访问的属性的时候 调用_set方法 __GET 获取一个不可访问的属性的时候 调用_get 方法 <?php class stu{ private $a; priva ...
- PHP 魔术方法__set() __get() 方法详解
__set() is run when writing data to inaccessible properties. __get() is utilized for reading data fr ...
- php之魔术方法 __set(),__get(),__isset(),__unset()
__set()与__get() 当一个类里面,属性被设置为私有属性时,这个属性是不能在外部被访问的.那么当我们又想在外部访问时该怎么办呢,我们可以用方法来实现.举例如下: 1 class Test 2 ...
- 跟着百度学PHP[4]OOP面对对象编程-13-魔术方法__set(),__get(),__isset(),__unset()
__set() 在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法) __get() 方法用于获取私有属性值.(在设置私 ...
- __set(),__get() 魔术方法示例
<?php class Ren{private $name;private $age;private $sex;function __set($name,$value){ if($name == ...
- PHP面向对象魔术方法之__get 和 __set函数
l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...
- python之魔法方法介绍
1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...
- python_面向对象魔法方法指南
原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...
随机推荐
- 在window下配置laravel开发环境
1.由于有一点php基础,所以非常想更进一步,就选择据说在国外最流行的php框架来学习了,laravel框架,官网上介绍是为艺术而生,从知乎和一些论坛上看到,laravel学起来并不简单,首先配置问题 ...
- svg.js教程及使用手册详解(二)
上篇简要介绍了svg.js的基本信息和基本用法,这篇开始详细讲解svg.js的用法. SVG元素 SVG元素主要包括各种形状.线条.文本.路径. 矩形——Rect Rects有两个参数,即矩形的宽度和 ...
- 学习zepto.js(对象方法)[2]
今天来说下zepto那一套dom操作方法, prepend,append,prependTo,appendTo,before,after,insertBefore,insertAfter; 按着从内到 ...
- getElementsByTagName() 方法
HTML DOM Document 对象 定义和用法 getElementsByTagName() 方法可返回带有指定标签名的对象的集合. 语法 document.getElementsByTagNa ...
- AngularJS 参考手册
AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用程序的根元素. ng-bind 绑定 HTML 元素到应用程序数据 ...
- Android Couldn't load BaiduMapSDK
什么都不用多说,看代码 Couldn't load BaiduMapSDK_v3_2_0_15 from loader dalvik.system.PathClassLoader[DexPathLis ...
- ToolBar和DrawerLayout的使用实现侧拉栏抽屉的开闭
1.如图可以看到textColorPrimary,colorPrimary,colorPrimaryDark,navigationBarColor等颜色属性代表的相应位置,如下图 2.具体属性在res ...
- Ubuntu14.04 Django Mysql安装部署全过程
Ubuntu14.04 Django Mysql安装部署全过程 一.简要步骤.(阿里云Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便 ...
- ns3重要类
1. simple-ref-count 递归模板,使得通过定义T:SimpleRefCount<T>使得T类都具有计数功能 template <typename T, typenam ...
- Coding道场:第一次
10/23日,我在部门内部进行了一次内部学习,使用目前流行的Coding Dojo(道场)方式,进行了TDD开发的演练.演练的题目如下: 有关Coding道场的介绍,请自行百度一下,我就不再多 ...