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读MYSQL中文乱码的解决方法
Dec 17 PHP
一些常用的php简单命令代码集锦
Sep 24 PHP
php截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php提交表单发送邮件的方法
Mar 20 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
php实现微信模板消息推送
Mar 30 PHP
php5与php7的区别点总结
Oct 11 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
php如何获取Http请求
Apr 30 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管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
react基本安装与测试示例
2020/04/27 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
深入浅析Python中的yield关键字
2018/01/24 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
班主任与学生安全责任书
2014/07/25 职场文书
食品安全演讲稿
2014/09/01 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
优秀员工自荐书
2015/03/06 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
golang在GRPC中设置client的超时时间
2021/04/27 Golang
JUnit5常用注解的使用
2021/07/02 Java/Android