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 相关文章推荐
用Simple Excel导出xls实现方法
Dec 06 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
php顺序查找和二分查找示例
Mar 27 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
PHP经典面试题集锦
Mar 19 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
bootstrap table小案例
2016/10/21 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
详解Django框架中的视图级缓存
2015/07/23 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
基于python log取对数详解
2018/06/08 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
食品营养与检测应届生求职信
2013/11/08 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
公积金接收函格式
2015/01/30 职场文书
董事长助理岗位职责
2015/02/11 职场文书
被委托人身份证明
2015/08/07 职场文书
公司管理建议书
2015/09/14 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书