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

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

class info {

private $province; //省

public  $city;     //城市

private $myname;   //姓名

//__construct()方法到实例化时自动加载function

function __construct() {

echo "实例化我就起作用
";

$this->myname("张映");

}

//__call()方法用来获取没有定义的function

function __call($name, $param) {

echo $name."这个方法没有定义,跑到我这儿来了
";

print_r($param) ;

echo "
";

}

//定义一个方法

function myname($param) {

echo "定义过的就到定义过的这儿来,$param
";

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__."
";

return __CLASS__;

}

//__set()方法用来设置私有变量值

private function __set($name, $value) {

echo "设置私有变量时,自动调用了这个__set()方法为私有变量赋值
";

$this-> $name = $value;

}

//__isset()方法判断私有变量值

private function __isset($name) {

echo "isset()函数判断私有变量是不是被定义时,自动调用__isset()
";

return isset ($this-> $name);

}

//__unset()方法删除私有变量值

private function __unset($name) {

echo "unset()函数删除一个私有变量时,自动调用__unset()
";

unset ($this-> $name);

}

//__destruct()删除类对象时自动会调用

public function __destruct() {

echo '删除类对像,就到__destruct()这儿来
';

}

}

$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)) . "
";   //会调用__isset()方法和__get()方法

echo $info->province . "
";     //会调用__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()的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值