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 新增)。 |