PHP中__set()实例用法和基础讲解

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;
 }
}
?>
(0)

相关推荐

  • Python 检查数组元素是否存在类似PHP isset()方法

    PHP中有isset方法来检查数组元素是否存在,在Python中无对应函数. Python的编程理念是"包容错误"而不是"严格检查".举例如下: 复制代码 代码如下: Look before you leap (LBYL): if idx < len(array): array[idx] else: #handle this Easier to ask forgiveness than permission (EAFP): try: array[idx] ex

  • PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法

    ISSET();--适合于检测是否存在这个参数. 定义和作用范围:用于测试一个变量是否具有值(包括0,FALSE,或者一个空字串,但不能是NULL),即:"http://localhost/?fo="也是可以通过检测,因此不适用.但如果是"http://localhost/"参数中并不含fo参数,就可以用isset来检测,此时isset($_GET['fo'])返回false. 不适用于:该函数不适合于验证html表单中的文本的有效方式.要检查用户输入文本是否有效,

  • PHP中检查isset()和!empty()函数的必要性

    isset()函数是PHP中的内置函数,它检查变量是否已设置且不为NULL.此函数还检查声明的变量,数组或数组键是否具有空值,如果是,isset()返回false,它在所有其他可能的情况下返回true. 语法: bool isset( $var, mixed ) 参数:此函数接受多个参数.这个函数的第一个参数是$ var.此参数用于存储变量的值. 例: <?php $num = '0'; if( isset( $num ) ) { print_r(" $num is set with is

  • PHP中isset()和unset()函数的用法小结

    isset(PHP 3, PHP 4, PHP 5 ) isset -- 检测变量是否设置 描述bool isset ( mixed var [, mixed var [, ...]])如果 var 存在则返回 TRUE,否则返回 FALSE. 如果已经使用 unset() 释放了一个变量之后,它将不再是 isset().若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE.同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数.

  • PHP中删除变量时unset()和null的区别分析

    第一种方法:$varname=null 第二种方法:unset($varname) 这两种方法都可以删除变量,但结果有些许的差别. 代码: 复制代码 代码如下: <?php $a = array( 'a' => 'a', 'b' => 'b' ); $b = array( 'a' => 'a', 'b' => 'b' ); $a['b'] = null; unset($b['b']); print('<pre>'); print_r($a); print('<

  • php reset() 函数指针指向数组中的第一个元素并输出实例代码

    reset函数将数组的内部指针指向第一个单元,并输出该数组. 基本语法 reset(array) reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值. 参数介绍: 参数 描述 array 必需.规定要使用的数组. 返回值 返回数组第一个单元的值,如果数组为空则返回 FALSE. 实例 <?php $array = array('step one', 'step two', 'step three', 'step four'); // 数组默认指针指向第一个元素 e

  • PHP中__set()实例用法和基础讲解

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 其中__set(),设置一个类的成员变量时调用 __set() 的作用: __set( $property, $value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值. 请看下面的演示代码: <?php class Person { private $name; private $age; public functi

  • java中list的用法和实例讲解

    目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引位置重新生成一个新的list(截取集合): 对比两个list中的所有元素: 判断list是否为空: 返回Iterator集合对象: 将集合转换为字符串: 将集合转换为数组: 集合类型转换: 去重复: 备注:内容中代码具有关联性. 1.list中添加,获取,删除元素: 添加方法是:.add(e): 获

  • C++中stringstream的用法和实例

    之前在leetcode中进行string和int的转化时使用过istringstream,现在大致总结一下用法和测试用例. 介绍:C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件. istringstream类用于执行C++风格的串流的输入操作. ostringstream类用于执行C风格的串流的输出操作. stringstream类同时可以支持C风格的串流的输入输出操作. 下图详细描述了几

  • Java基础将Bean属性值放入Map中的实例

    Java基础将Bean属性值放入Map中的实例 利用发射将Java对象的属性值以属性名称为键,存储到Map中的简单实现.包括自身属性及从父类继承得到的属性.Java类型的getField[s]方法只能获取public 类型的属性,getDeclaredFields则能获取所有声明的属性,同时,如果类的可见性非公有,则Field的get(Object)方法将取不到具体的属性值. package com.wood.util; import java.lang.reflect.Field; impor

  • python读取csv文件并把文件放入一个list中的实例讲解

    如下所示: #coding=utf8 ''' 读取CSV文件,把csv文件放在一份list中. ''' import csv class readCSV(object): def __init__(self,path="Demo.csv"): #创建一个属性用来保存要操作CSV的文件 self.path=path try: #打开一个csv文件,并赋予读的权限 self.csvHand=open(self.path,"r") #调用csv的reader函数读取csv

  • python中waitKey实例用法讲解

    1.说明 用于等待按钮.当用户按下按钮时,句子将被执行并获得返回值. 2.语法 retval=cv2.waitKey([delay]) Retval:表示返回值: Delay:键触发的时间,单位为ms. 3.实例 import cv2 lena=cv2.imread("D:\pmjcv\lena.bmp") cv2.namedWindow("lesson") cv2.imshow("lesson",lena) key=cv2.waitKey()

  • JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象JS基础讲解,工厂模式.构造函数模式.原型模式.混合模式.动态原型模式>,接下来讲一般通过那些方法完成JavaScript的继承. 原型链 JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即"子类型.prototype = new 父类型();&qu

  • jQuery插件imgAreaSelect基础讲解

    关于ImgAreaSelect,  是一jQuery插件,它支持用户通过鼠标拖曳选择图片的一部分,如图片拖曳.图片编辑等~~来具体看一下 1.先下载imgAreaSelect插件 下载地址: 英文:http://odyniec.net/projects/imgareaselect/ 中文:http://www.css88.com/EasyTools/javascript/jQueryPlugin/imgAreaSelect/index.html 在头部引用: <link rel="styl

  • Java手把手必会的实例汉诺塔讲解练习

    最适合菜鸟的汉诺塔讲解 问题引入 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 让我们先从小事入手. 标记汉诺塔的三根柱子分别为 a ,b ,c 标记汉诺塔上的圆盘分别为:1 ,2,3,4 -n a 柱上面只有一个圆盘时 只有这一种走法 a柱上有两个圆盘时

  • C#表达式树Expression基础讲解

    什么是表达式树 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等.可以对表达式树中的代码进行编辑和运算. 这样能够动态修改可执行代码.在不同数据库中执行 LINQ 查询以及创建动态查询. 表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言 (MSIL). 这段话是来自官网( [表达式树 (C#) | Microsoft Docs](

随机推荐