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操作SVN版本服务器类代码
Nov 27 PHP
PHP原生模板引擎 最简单的模板引擎
Apr 25 PHP
php模板函数 正则实现代码
Oct 15 PHP
php动态添加url查询参数的方法
Apr 14 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
解决Laravel 不能创建 migration 的问题
Oct 09 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 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删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
学python安装的软件总结
2019/10/12 Python
python能否java成为主流语言吗
2020/06/22 Python
浅析Python 序列化与反序列化
2020/08/05 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
介绍一下except的用法和作用
2015/01/22 面试题
教师简历自我评价
2014/02/03 职场文书
正风肃纪剖析材料
2014/02/18 职场文书
学校安全责任书范本
2014/07/23 职场文书
运动会表扬稿
2015/01/16 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Java版 单机五子棋
2022/05/04 Java/Android