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 相关文章推荐
一个简单的域名注册情况查询程序
Oct 09 PHP
php 获取客户端的真实ip
Nov 30 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
tp5框架的增删改查操作示例
Oct 31 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
摩卡咖啡
2021/03/03 咖啡文化
一个目录遍历函数
2006/10/09 PHP
php foreach、while性能比较
2009/10/15 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
js 创建书签小工具之理论
2011/02/25 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
深入理解Vuex 模块化(module)
2017/09/26 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
js实现移动端轮播图滑动切换
2020/12/21 Javascript
深入理解Python中各种方法的运作原理
2015/06/15 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
Python os.access()用法实例
2019/02/18 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
python中判断文件结束符的具体方法
2020/08/04 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
可可西里观后感
2015/06/08 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python