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文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php下实现折线图效果的代码
Apr 28 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 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仿QQ验证码的实例分析
2013/07/01 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
php处理带有中文URL的方法
2016/07/11 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
flask入门之表单的实现
2018/07/18 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
文明礼仪事迹材料
2014/01/09 职场文书
锦旗标语大全
2014/06/23 职场文书
2014年团总支工作总结
2014/11/21 职场文书
学前教育见习总结
2015/06/23 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python