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. Java初始化顺序

    package com.helei.init; class Log { public static String fatherStaticString(){System.out.println(&qu ...

  2. 【转】php pdo连接数据库 解决中文乱码问题(wordpress mysql 问号?? ??)

    原文链接:http://blog.csdn.net/ysydao/article/details/11002295 PHP 用pdo连接数据库时出现中文乱码问题解决办法 1.array(PDO::MY ...

  3. jQuery:详解jQuery中的事件(一)

    之前用过一些jQuery的动画和特效,但是用到的部分也不超过10%的样子,感觉好浪费啊——当然浪费的不是jQuery,而是Web资源.后来就想深入研究下jQuery的内部机理,读过两遍jQuery源代 ...

  4. Understanding glibc malloc【待译】

    今天尝试用Valgrind调试程序时,发现堆和栈的一些问题没有理解透彻,于是Google了下"Memory Layout C",接着就通过Memory Layout of C Pr ...

  5. js 循环li添加点击事件 (闭包的应用)

    var aLi = document.querySelectorAll('.article-tab li');  for (var i = 0; i <= aLi.length; i++) {  ...

  6. su到普通用户不能起图形 解决办法

    环境介绍:       登录系统的时候采用的是root用户,然后su - oracle帐户后,然后执行startx命令启动图形界面之后就报如下的错误,根据提示是PAM起作用了.如下是错误信息:[ora ...

  7. Introduction to Microsoft Dynamics 365 licensing

    Microsoft Dynamics 365 will be released on November 1. In preparation for that, Scott Guthrie hosted ...

  8. SharePoint 2013 配置Excel Services

    前言:本文主要介绍如何启用SharePoint 2013版本Excel Services服务,并配置Excel Web Access部件,使Excel文档可以显示在Web页面中. 简单说一下流程,Sh ...

  9. 用Kotlin开发Android应用(II):创建新项目

    这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...

  10. OC 观察者模式(通知中心,KVO)

    OC 观察者模式(通知中心,KVO) 什么是观察者模式??? A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化.这就是观察者模式. 观察者模式定义了一种一对多的依赖关系, ...