php中__call(),__get(),__set(),__construct(),__isset()等一些总结

张映 发表于 2010-08-01

分类目录: php

标签:, , , , , , , ,

今天在看代码的时候,无意思中发现了__toString()这个方法,从表面意思上看,是类型转换的方法,但是加上二个下"_"后,是不是根__get()这样的方法,用法一样呢?我很想知道php里面,像带有二个"_"的方法有多少个,下面就我发现的带二个"_"的方法,写了一个小例子,来说明__call(),__get(),__set(),__construct(),__isset(),__destruct()等的用法。看例子:

<?php
class info {

 private $province; //省
 public  $city;     //城市
 private $myname;   //姓名

 //__construct()方法到实例化时自动加载function
 function __construct() {
 echo "实例化我就起作用<br>";
 $this->myname("张映");
 }

 //__call()方法用来获取没有定义的function
 function __call($name, $param) {
 echo $name."这个方法没有定义,跑到我这儿来了<br>";
 print_r($param) ;
 echo "<br>";
 }

 //定义一个方法
 function myname($param) {
 echo "定义过的就到定义过的这儿来,$param<br>";
 return $this->myname = $param;
 }

 //__get()得到私有变量值
 private function __get($name) {
 if (isset ($this-> $name)) {
 return ($this-> $name);
 } else {
 return false;
 }
 }

 //__toString()
 private function __toString() {
 echo '你输入的这个类的名子叫'.__CLASS__."<br>";
 return __CLASS__;
 }

 //__set()方法用来设置私有变量值
 private function __set($name, $value) {
 echo "设置私有变量时,自动调用了这个__set()方法为私有变量赋值<br>";
 $this-> $name = $value;
 }

 //__isset()方法判断私有变量值
 private function __isset($name) {
 echo "isset()函数判断私有变量是不是被定义时,自动调用__isset()<br>";
 return isset ($this-> $name);
 }

 //__unset()方法删除私有变量值
 private function __unset($name) {
 echo "unset()函数删除一个私有变量时,自动调用__unset()<br>";
 unset ($this-> $name);
 }

 //__destruct()删除类对象时自动会调用
 public function __destruct() {
 echo '删除类对像,就到__destruct()这儿来<br>';
 }
}

$info = new info();        //会调用__construct()方法和__destruct()方法
$info->province = "安徽";        //会调用__set()方法
$info->city = "合肥";                //不会调用__set()方法
$info->myname("张映");      //会调用myname()方法
$info->nickname("tank");   //会调用__call()方法
(string)$info;             //会调用__toString()方法
var_dump(isset ($info->province)) . "<br>";   //会调用__isset()方法和__get()方法
echo $info->province . "<br>";     //会调用__get()方法
unset ($info->province);           //会调用__unset()方法
echo $info->province;              //已经被删除了, 所以不会显示为安徽了,会调用__isset()方法
?>

运行结果如下:

实例化我就起作用
定义过的就到定义过的这儿来,张映
设置私有变量时,自动调用了这个__set()方法为私有变量赋值
定义过的就到定义过的这儿来,张映
nickname这个方法没有定义,跑到我这儿来了
Array ( [0] => tank )
你输入的这个类的名子叫info
isset()函数判断私有变量是不是被定义时,自动调用__isset()
bool(true) 安徽
unset()函数删除一个私有变量时,自动调用__unset()
isset()函数判断私有变量是不是被定义时,自动调用 __isset()
删除类对像,就到__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()的方法。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/947.html/comment-page-1

2 条评论

  1. rose 留言

    # private function __set($name, $value) {
    # echo "设置私有变量时,自动调用了这个__set()方法为私有变量赋值";
    # $this-> $name = $value;
    # }

    为什么用private? 外部调用不会报错吗???

  2. 张映 留言

    用private是只允许自身调用,如果没有__set()方法的话,外部直接赋值都会报错,$info->province = "安徽"; 会报fatal error。如果没有__get()方法的话,外部调用都会报错,echo $info->province; 会报fatal error。