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
网站当前的在线人数
Oct 09 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 PHP
php查询ip所在地的方法
Dec 05 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
初识ThinkPHP控制器
Apr 07 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
YII框架常用技巧总结
Apr 27 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 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
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
javascript模块化简单解析
2016/04/07 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
Python项目跨域问题解决方案
2020/06/22 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
班长自荐书范文
2014/02/11 职场文书
车队司机自我鉴定
2014/03/02 职场文书
《赠汪伦》教学反思
2014/04/12 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
经典祝酒词大全
2015/08/12 职场文书
2016小学新学期寄语
2015/12/04 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技