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 新增)。
原文地址:https://www.cnblogs.com/Steven-shi/p/5332025.html