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面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
解析MySql与Java的时间类型
Jun 22 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
php头像上传预览实例代码
May 02 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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实用函数分享之去除多余的0
2015/02/06 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
讲解Python中fileno()方法的使用
2015/05/24 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
详解Python3 基本数据类型
2019/04/19 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
财务总监管理职责范文
2014/03/09 职场文书
总经理工作职责范文
2014/03/14 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
作文评语集锦
2014/12/25 职场文书
故宫的导游词
2015/01/31 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
python中if和elif的区别介绍
2021/11/07 Python
Python学习之包与模块详解
2022/03/19 Python