php中的重载以及几个常用的魔术方法示例

在面向对象语言中,有一个很重要的概念——overload,即重载。所谓重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。但是,在php中,这个概念跟大多面向对象语言中的“重载”一点关系都没有,根本就是风马牛不相及的。

php中的重载,是指动态地"创建"类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。再说的直白点,就是访问一个类或者对象的不可访问的属性或者方法的时候的一种处理机制。(不可访问,比如不存在或者因访问关键字的限制而不能访问)

1、属性重载

四个魔术方法:

1)__get($属性名)

  访问对象中不可访问的属性的时候,会自动调用该方法  

2)__set($属性名,$属性值)

  给对象中不可访问的属性赋值的时候,会自动调用该方法。方法中的两个参数,依次代表所访问的属性和对应的值。

3)__isset($属性名)

  当对一个对象不可访问的属性进行isset()或者empty()判断的时候,会自动调用该方法。

4)__unset($属性名)

  当对一个对象不可访问的属性进行unset()销毁的时候,会自动调用该方法。

使用的代码如下:

<?php
  header("Content-type:text/html;charset = utf-8");

  class Test{
    public $p1 = 1;

    function __get($property) {//访问不可访问属性的时候,会自动调用该方法
      echo "不可访问的属性:{$property}";
    }

    function __set($property,$value) {//对不可访问的属性赋值,会自动调用该方法
      echo "对不可访问的属性{$property} 赋值 {$value}<br/>";
    }

    function __isset($property){//对不可访问的属性进行isset判断,会自动调用该方法
      echo "对不可访问的属性{$property}进行isset判断<br/>";
    }

    function __unset($property){//对不可访问的属性进行unset操作,会自动调用该方法
      echo "对不可访问的属性{$property}进行unset操作<br/>";
    }
  }

  $t = new Test();
  echo $t->p1."<br/>";
  echo $t->p2."<br/>";

  //给不可访问的属性进行赋值
  $t->p3 = 2;

  //对不可访问的属性进行isset判断
  isset($t->p4);

  //对不可访问的属性进行unset操作
  unset($t->p5);

  /*
    运行结果:
          1
          不可访问的属性:p2
          对不可访问的属性p3 赋值 2
          对不可访问的属性p4进行isset判断
          对不可访问的属性p5进行unset操作
  */
?>

配合是用__get()和__set()方法,可以使类变得更加灵活和自由,可以很方便给类添加属性。如下:

<?php
  header("Content-type:text/html;charset = utf-8");

  class Test{
    //定义数组,用于存储不可访问的属性
    protected $plist = array();

    function __get($property) {//访问不可访问属性的时候,会自动调用该方法
      //属性不可访问,从plist中读取
      if (isset($this->plist[$property])) {
        return $this->plist[$property];
      }
      else {
        return "属性{$property}不可访问";
      }
    }

    function __set($property,$value) {//对不可访问的属性赋值,会自动调用该方法
      //属性不可访问,将之存放到plist中
      $this->plist[$property] = $value;
    }

    function __isset($property){//对不可访问的属性进行isset判断,会自动调用该方法
      $v = isset($this->plist[$property]);
      return $v;
    }

    function __unset($property){//对不可访问的属性进行unset操作,会自动调用该方法
      unset($this->plist[$property]);
    }
  }

  $t = new Test();
  $t->p1 = 1;//对不可访问的属性赋值
  echo "不可访问的属性p1的值为:".$t->p1."<br/>";//使用p1属性(经过上一行代码,p1已经添加到了plist中)

  echo "不可访问的属性p2的值为:".$t->p2."<br/>";//没对p2赋值过

  //分别对p1和p2进行isset操作
  $r1 = isset($t->p1);//结果为true,但是如果不处理__isset魔术方法,将返回false
  $r2 = isset($t->p2);//结果为false,本来也不存在...
  var_dump($r1);echo "<br/>";
  var_dump($r2);echo "<br/>";

  //分别对p1和p2进行unset操作
  unset($t->p1);
  unset($t->p2);
  echo "不存在的属性p1的值为:".$t->p1."<br/>";
  echo "不存在的属性p2的值为:".$t->p2."<br/>";

  /*
    结果:
        不可访问的属性p1的值为:1
        不可访问的属性p2的值为:属性p2不可访问
        bool(true)
        bool(false)
        不可访问的属性p1的值为:属性p1不可访问
        不可访问的属性p2的值为:属性p2不可访问
  */
?>

2、方法重载

1)__call()

  调用对象的不可访问的方法的时候,会自动调用该方法。

2)__callstatic()

  调用类的不可访问的静态方法的时候,会自动调用该方法。

时间: 2024-08-28 18:10:23

php中的重载以及几个常用的魔术方法示例的相关文章

php面向对象类中常用的魔术方法

php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct() class construct{ public function __construct(){ $this->var = "this is var"; } } class con2 extends construct{ public function __construct(){ $

PHP中常用的魔术方法

我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(),__tostring(),__invoke(),__set(),__get(),__unset(),__isset(),__call(),__callstatic; 1,__constuct()构造函数 通常实例化完一个对象之后,都要对该对象的属性进行初始化!在实例化一个对象的时候,PHP系统会自动

python中单例模式的实现-通过闭包函数和魔术方法__new__实现单例模式

1.通过闭包函数实现单例模式: # 使用闭包函数实现单例 def single(cls, *args, **kwargs): instance = {} def get_instance(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return get_instance @single class Apple: pass a = Apple() b = Apple() p

Python中内置类型和定义了__nonzero__的魔术方法的类都能在if语句中呗解释为True或False

1 >>> a =[1,2,3] 2 >>> if a: 3 print('I found something') 4 5 6 I found something 7 >>> b = [] 8 >>> if not b: 9 print('Empty') 10 11 12 Empty 13 >>> b = [] 14 >>> if b: 15 print('Empty') 16 17 18 >

PHP常用的魔术方法及规则

转:https://www.cnblogs.com/wanglijun/p/10926303.html 1. __construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行.2. __desstruct 对象的所有引用都被删除或者当对象被显式销毁时执行.3.__call()在对象中调用一个不可访问方法时,__call() 会被调用.4.__callStatic()在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用.5.__set() 在给不可访

php常用的魔术方法

__construct:构造函数,一旦创建对象都就会自动调用 __call:当调用了未定义的方法时会自动触发 __set:当给类外部不可访问的属性设置值时会自动触发 __get:当获取类外部不可访问的属性时会自动触发 __isset:当对类外部不可访问的属性使用了isset()或empty()时会自动触发 __unset:当对类外部不可访问的属性使用了unset()时会自动触发 __destruct:当对象结束其生命周期时就会自动触发 <?php header("content-type:

php中常用到的魔术方法

PHP面向对象中有很多功能很强大,不得不说的就是魔术方法了.今天抽出时间记录几个比较常用的魔术方法: 1.__construct 这是构造函数,指当一个类被实例化的时候就会自动调用的函数.那我们可以在这里初始化变量的值.例如: class Score { public $chinese; public $english; public $math; public function __construct($chinese=100,$english=99,$math=98) { $this->ch

php中的常用魔术方法总结

以下是对php中的常用魔术方法进行了详细的总结介绍,需要的朋友可以过来参考下 常用的魔术方法有:__Tostring ()  __Call()  __autoLoad()  __ clone()  __GET()   __SET()    __isset()  __unset() 1.__Tostring()   用于定义输出对象引用时调用  常用于打印一些对象的信息 必须有返回值eg:有一个persion类Persion per =new persion()Echo per;    //直接调

PHP中的常见魔术方法功能作用及用法实例

概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发.这篇文章简单总结了PHP中提供的魔术方法. 开始之前 在总结PHP的魔术方法之前先来定义两个类,以便后边示例使用: 复制代码代码如下: <?phpclass Device {    public $name;               public $battery;            public $data