PHP中__set()实例用法和基础讲解


Posted in PHP onJuly 23, 2019

PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。
其中__set(),设置一个类的成员变量时调用

__set() 的作用:

__set( $property, $value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

请看下面的演示代码:

<?php

class Person

{

  private $name;

  private $age;

  public function __construct($name="", $age=25)

  {

    $this->name = $name;

    $this->age = $age;

  }

  /**

   * 声明魔术方法需要两个参数,真接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值

   * @param $property

   * @param $value

   */

  public function __set($property, $value) {

    if ($property=="age")

    {

      if ($value > 150 || $value < 0) {

        return;

      }

    }

    $this->$property = $value;

  }

  /**

   * 在类中声明说话的方法,将所有的私有属性说出

   */

  public function say(){

    echo "我叫".$this->name.",今年".$this->age."岁了";

  }

}

$Person=new Person("小明", 25); //注意,初始值将被下面所改变

//自动调用了__set()函数,将属性名name传给第一个参数,将属性值”李四”传给第二个参数

$Person->name = "小红";   //赋值成功。如果没有__set(),则出错。

//自动调用了__set()函数,将属性名age传给第一个参数,将属性值26传给第二个参数

$Person->age = 16; //赋值成功

$Person->age = 160; //160是一个非法值,赋值失效

$Person->say(); //输出:我叫小红,今年16岁了

运行结果:

我叫小红,今年16岁了

知识点扩展

PHP5中__get()、__set()方法

__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。

__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。(key=>value)

/*
*person.class.php
*/
<?php
 
class Person{
 
  private $name;
  public $age;
  public $sex;
  public $addrs;
  public $time;
 
  function __construct($name,$age,$sex,$addrs){
    //parent::__construct();
    $this->name = $name;
    $this->age = $age;
    $this->sex = $sex;
    $this->addrs = $addrs;
  }
 
  private function __get($pri_name){
    if(isset($this->$pri_name)){
      echo "pri_name:".$this->$pri_name."<br>";
      return $this->$pri_name;
    }else{
      echo "不存在".$pri_name;
      return null;
    }
  }
 
  private function __set($pri_name,$value){
    echo $pri_name."的值为:".$value."<br>";
    $this->$pri_name = $value;
  }
 
  function user($time){
    $this->time = $time;
    echo "我叫:".$this->name.",今年:".$this->age."岁,性别:".$this->sex.",地址是:".$this->addrs.",--".$this->time."<br>";
  }
 
  function __destruct(){
    echo "再见:".$this->name."<br>";
  }
 
}
 
?>
/*
*person.php
*/
<?php
  require "person.class.php";
 
  $Person = new Person("xy404","22","男","湖北");
  $Person->user(404);
 
  $Person->name = "aib";//在person.class.php中的person类中name这个属性private的。所以它在赋值的时候自动调用了__set()这个方法.如果没有__set()方法就会报错。
 
  echo $Person->name."<br>";
?>

一般在调用类的属性和方法的时候会使用:$this->name 或 $this->name()来完成。下面通过一个简单的例子来说明一下$this->$name的这种用法。

<?php
class Test{
 public $name = "abc";
 public $abc = "test";

 public function Test(){
    $name1 = "name";
    echo $this->name;  // 输出 abc
    echo $this->$name1; // 输出 abc,因为 $name1 的值是name,相当与这里替换成 echo $this->name;
    $name2 = $this->$name1; // $name2 的值是 abc
    echo $this->$name2; // 输出 test,同上,相当与是 echo $this->abc;
 }
}
?>
PHP 相关文章推荐
第八节--访问方式
Nov 16 PHP
PHP+MySQL 制作简单的留言本
Nov 02 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
PHP 第一节 php简介
Apr 28 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
微信公众平台开发之配置与请求
Aug 26 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
CI框架简单邮件发送类实例
May 18 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 PHP
php慢查询日志和错误日志使用详解
Feb 27 PHP
PHP大文件分块上传功能实例详解
Jul 22 #PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 #PHP
php多进程应用场景实例详解
Jul 22 #PHP
PHP实现的多进程控制demo示例
Jul 22 #PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 #PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 #PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 #PHP
You might like
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
php xhprof使用实例详解
2019/04/15 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
python中set常用操作汇总
2016/06/30 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
Python celery原理及运行流程解析
2020/06/13 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
金士达面试非笔试
2012/03/14 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
新闻编辑自荐信
2013/11/03 职场文书
电气技术员岗位职责
2013/11/19 职场文书
房产委托公证书样本
2014/04/04 职场文书
消防安全宣传标语
2014/06/07 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书