zoukankan      html  css  js  c++  java
  • PHP中常见魔术方法解析

     1 <?php  
     2 class info {  
     3   
     4  private $province; //
     5  public  $city;     //城市  
     6  private $myname;   //姓名  
     7   
     8  //__construct()方法到实例化时自动加载function  
     9  function __construct() {  
    10  echo "实例化我就起作用<br>";  
    11  $this->myname("Steven");  
    12  }  
    13   
    14  //__call()方法用来获取没有定义的function  
    15  function __call($name, $param) {  
    16  echo $name."这个方法没有定义,跑到我这儿来了<br>";  
    17  print_r($param) ;  
    18  echo "<br>";  
    19  }  
    20   
    21  //定义一个方法 ,即普通的定义方法
    22  function myname($param) {  
    23  echo "定义过的就到定义过的这儿来,$param<br>";  
    24  return $this->myname = $param;  
    25  }  
    26   
    27  //__get()得到私有变量值  
    28  private function __get($name) {  
    29  if (isset ($this-> $name)) {  
    30  return ($this-> $name);  
    31  } else {  
    32  return false;  
    33  }  
    34  }  
    35   
    36  //__toString()  
    37  private function __toString() {  
    38  echo '你输入的这个类的名子叫'.__CLASS__."<br>";  
    39  return __CLASS__;  
    40  }  
    41   
    42  //__set()方法用来设置私有变量值  
    43  private function __set($name, $value) {  
    44  echo "设置私有变量时,自动调用了这个__set()方法为私有变量赋值<br>";  
    45  $this-> $name = $value;  
    46  }  
    47   
    48  //__isset()方法判断私有变量值  
    49  private function __isset($name) {  
    50  echo "isset()函数判断私有变量是不是被定义时,自动调用__isset()<br>";  
    51  return isset ($this-> $name);  
    52  }  
    53   
    54  //__unset()方法删除私有变量值  
    55  private function __unset($name) {  
    56  echo "unset()函数删除一个私有变量时,自动调用__unset()<br>";  
    57  unset ($this-> $name);  
    58  }  
    59   
    60  //__destruct()删除类对象时自动会调用  
    61  public function __destruct() {  
    62  echo '删除类对像,就到__destruct()这儿来<br>';  
    63  }  
    64 }  
    65   
    66 $info = new info();        //会调用__construct()方法和__destruct()方法  
    67 $info->province = "陕西";        //会调用__set()方法  
    68 $info->city = "西安";                //不会调用__set()方法  
    69 $info->myname("Steven");      //会调用myname()方法  
    70 $info->nickname("peng");   //会调用__call()方法  
    71 (string)$info;             //会调用__toString()方法  
    72 var_dump(isset ($info->province)) . "<br>";   //会调用__isset()方法和__get()方法  
    73 echo $info->province . "<br>";     //会调用__get()方法  
    74 unset ($info->province);           //会调用__unset()方法  
    75 echo $info->province;              //已经被删除了, 所以不会显示为安徽了,会调用__isset()方法  
    76 ?>  

    结果:

     1 实例化我就起作用  
     2 定义过的就到定义过的这儿来,Steven  
     3 设置私有变量时,自动调用了这个__set()方法为私有变量赋值  
     4 定义过的就到定义过的这儿来,Steven  
     5 nickname这个方法没有定义,跑到我这儿来了  
     6 Array ( [0] => peng )  
     7 你输入的这个类的名子叫info  
     8 isset()函数判断私有变量是不是被定义时,自动调用__isset()  
     9 bool(true) 陕西  
    10 unset()函数删除一个私有变量时,自动调用__unset()  
    11 isset()函数判断私有变量是不是被定义时,自动调用 __isset()  
    12 删除类对像,就到__destruct()这儿来  

    总结:

    1,__set(),__get(),__isset(),__unset()可以归于一类,对于私有变量的赋值,取值,判断,删除操作。以赋值为例,$province是私有变量,$city是全局变量,赋值的时候,$province调用了__set()方法,而$city却没有调用__set()这个方法

    2,__construct()构造函数,__destruct()析构函数,他们二个都是实例化类的时候就会产生,有一点不同,构造在最前面,析构函数在最后面。

    3,当你调用了一个class中没有的方法时,肯定会报fatal error,如果有了__call()函数,就不会报错了。$info->nickname("tank");class中并没有这个方法,但是他没有报错。传的参数是字符串,__call会把他转成数组。Array ( [0] => tank )

    4,(string)$info;把$info这个obj强制转成字符串,从表面意思看是这个,但是实际上是调用__toString()的方法。

    附几个PHP 的魔术常量:

    __LINE__ 文件中的当前行号。
    __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
    __DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
    __FUNCTION__  函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
    __CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 FooBar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
    __TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 FooBar)。
    __METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
    __NAMESPACE__ 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/Steven-shi/p/5332025.html
Copyright © 2011-2022 走看看