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 相关文章推荐
通过对服务器端特性的配置加强php的安全
Oct 09 PHP
第七节--类的静态成员
Nov 16 PHP
mysql下创建字段并设置主键的php代码
May 16 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
php实现的http请求封装示例
Nov 08 PHP
PHP面向对象程序设计之对象生成方法详解
Dec 02 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
使用PHPExcel导出Excel表
Sep 08 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
PHP命名空间(namespace)原理与用法详解
Dec 11 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 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
php 三维饼图的实现代码
2008/09/28 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
一起来写段JS drag拖动代码
2010/12/09 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
JavaScript闭包的简单应用
2017/09/01 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
python3中str(字符串)的使用教程
2017/03/23 Python
Python 对象中的数据类型
2017/05/13 Python
Python中创建二维数组
2018/10/17 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
意向书范文
2014/03/31 职场文书
企业党员个人自我评价
2014/09/20 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
MySQL一些常用高级SQL语句
2021/07/03 MySQL