zoukankan      html  css  js  c++  java
  • php类的魔术方法也就是带下划线的类方法介绍及应用

    001 PHP把所有以__(两个下划线)开头的类方法当成魔术方法,并且这些魔术方法的参数都不能通过引用传递。php的魔术方法有:
    002  __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。
    003  下面简单说一下对应的功能:
    004  Class MyClass {
    005  __construct($var1,$var2) {
    006  //构造器
    007  }
    008  __destruct() {
    009  //析构方法
    010  }
    011  __clone() {
    012  //克隆方法 $obj2 = clone $obj1; 时执行
    013  
    014 对象的复制
    015  
    016 class a{ 
    017     public $s = ''
    018
    019 $a_1 = new a(); 
    020 $a_1->s = 'a1'
    021 $a_2 = clone $a_1
    022 $a_2->s = 'a2'
    023 echo $a_1->s; //'a1' 
    024 echo $a_2->s; //'a2' 
    025  
    026 浅度复制
    027  
    028 class a{
    029   public $s = '';
    030  }
    031  class b{
    032   public $a = null;
    033   public $str = null;
    034  }
    035  
    036 $str = '123';
    037  $b_1 = new b();
    038  $b_1->a = new a();
    039  $b_1->str = & $str;
    040  
    041 $b_1->a->s = 'b1';
    042  $b_2 = clone $b_1;
    043  $b_2->a->s = 'aaaaa';
    044  $b_2->str = 'nihao';
    045  echo $b_1->a->s;
    046  echo " ";
    047  echo $b_1->str;
    048  echo " ";
    049  echo $b_2->a->s;
    050  echo " ";
    051  echo $b_2->str;
    052  
    053   
    054  
    055 深度复制
    056  
    057 class a{
    058   public $s = '';
    059  }
    060  class b{
    061   public $a = null;
    062   public $str = null;
    063   public function __clone(){
    064    $b = $this->str;
    065    $this->str = & $b;
    066    $this->a = clone($this->a);
    067   }
    068  }
    069  
    070 $str = '123';
    071  $b_1 = new b();
    072  $b_1->a = new a();
    073  $b_1->str = & $str;
    074  
    075 $b_1->a->s = 'b1';
    076  $b_2 = clone $b_1;
    077  $b_2->a->s = 'aaaaa';
    078  $b_2->str = 'nihao';
    079  echo $b_1->a->s;
    080  echo " ";
    081  echo $b_1->str;
    082  echo " ";
    083  echo $b_2->a->s;
    084  echo " ";
    085  echo $b_2->str;
    086  
    087  
    088  }
    089  __call($fun,$args) {
    090  //魔术调用 方法名和参数
    091  
    092     if(method_exists($this, $fun.count($args))){
    093  
    094        return call_user_func_array(array(&$this,$fun.count($args)),$args);
    095  
    096       }else{
    097  
    098        throw new Exception('调用了未知的方法:'.__METHOD__);
    099  
    100       }
    101  }
    102  __callStatic($fun,$args) {
    103  //魔术调用 静态方法名和参数
    104  //可见性未设置为public或未声明为static的时候会产生一个警告 。
    105  //本特性只在PHP 5.3.0 及以上版本有效。
    106     与__call区别:修饰stati
    107  }
    108  __invoke($args) {
    109  //把类作为函数使用 参数
    110  //当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用
    111  //本特性只在PHP 5.3.0 及以上版本有效。<span>   
    112  
    113 class Callme {        
    114     public function __invoke($phone_num) {            
    115     echo "Hello: $num";         }    
    116 }     
    117 $call = new Callme();    
    118 $call(13810688888); // "Hello: 13810688888 
    119 }
    120  __toSring() {
    121  //对象输出 $echo $obj = new Class(); 时输出 </span> }
    122  
    123  __set($var,$value) {
    124  //设置对象属性 $obj->var = value 赋值
    125  //在给未定义的变量赋值时,__set() 会被调用。
    126  }
    127  __get($var) {
    128  //读取对象属性 $obj->var 获取
    129  //读取未定义的变量的值时,__get() 会被调用。
    130  }
    131  __isset($var) {
    132  //判断对象内部属性是否存在 isset($obj->var )。
    133  //当对未定义的变量调用isset() 或 empty()时,__isset() 会被调用。
    134  //自PHP 5.1.0起有效
    135  }
    136  __unset($var) {
    137  //释放内部对象属性 unset($obj->var)。
    138  //当对未定义的变量调用unset()时,__unset() 会被调用。
    139  //自PHP 5.1.0起有效
    140  }
    141  
    142 __set_state(array $args) {
    143  //当调用var_export()时,这个静态 方法会被调用。
    144  //本方法的唯一参数是一个数组,其中包含按array(‘property’ => value, …)格式排列的类属性。
    145  //自PHP 5.1.0起有效
    146  }
    147  __sleep() {
    148  //序列化前奏方法 return array($var1,$var2);
    149  }
    150  __wakeup() {
    151  //反序列化前奏方法 $this->var = ‘other_value’
    152  }
    153  }
    154  
    155 补充:一个类外面使用的自动加载方法:
    156  
    157 __autoload($classname) {
    158  require(PATH.$classname.’_class.php’);
    159  }
    人生商业模式=能力(可怕的勤奋)+ 效率(效率,方法,工具)+杠杆(团队,产品,资本,影响力)
  • 相关阅读:
    iOS渠道分包2种模式之包内注入文件分包(iOS13验证签名问题)
    iOS13 新特性简介
    OC 字典dictionaryWithObjectsAndKeys报错
    博客迁移指南
    block内部实现原理(三)
    block内部实现原理(二)
    block内部实现原理(一)
    iOS:记一次Mac OS X 测试版(OS X EL Capitan) APP发布过程
    iOS: El Capitan Beta 下 Xcode6.4 不显示Scheme菜单
    iOS: UIWebView 中不加载图片(即浏览器常见的无图模式)
  • 原文地址:https://www.cnblogs.com/lovven/p/3304473.html
Copyright © 2011-2022 走看看