跟着百度学PHP[4]OOP面对对象编程-13-魔术方法__set(),__get(),__isset(),__unset()

时间:2023-03-09 00:29:40
跟着百度学PHP[4]OOP面对对象编程-13-魔术方法__set(),__get(),__isset(),__unset()

__set()
  在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法)

__get()
  方法用于获取私有属性值。(在设置私有属性的时候将会自动调用)

__isset()
  方法用于检测私有属性值是否被设定。(当外部使用isset读类内部进行检测对象是否有具有某个私有成员的时候就会被自动调用!)

__unset()
  方法用于删除私有属性。(在外部调用类内部的私有成员的时候就会自动的调用__unset魔术方法)

一篇关于魔术方法的文章:http://blog.csdn.net/binghui1990/article/details/9104725

00x1 案例一__get(达到了给你看,但是不能给你修改的效果!)

<?php
class human
{
private $name; #定义一个被封装的属性,也就是定义了一个私有的成员。在被调用的时候会,自动的调用__get魔术方法
public $sex;
public $age; public function __get($p){ #定义一个__get魔术方法,记住该魔术方法至少要有一个参数
echo "##############<br />";
}
public function h(){ #定义了一个h方法,只是为了充数的。
echo "hello world";
}
}
$a=new human();
echo $a->name; #在访问了一个私有的成员的时候PHP就会自动的调用__get魔术方法
?>
输出效果如下:
##############

再次对案例一括展(这一个括展主要是认识__get魔术引号在实际运用当中的实际案例)

<?php
class human
{
private $name; #定义一个被封装了的$name属性,倘若调用该封装成员将会自动的调用__get方法。
public $sex;
public $age; function __construct($name,$sex,$age) #对$name、$sex、$age初始化
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
} public function __get($p){ #__get魔术方法里面必须要有一个参数。
echo $this->name."<br />";
echo $this->$p;
}
}
$a=new human("妹子","女",);
echo $a->name; #调用name这个被封装的属性(也就是调用了name这个human类中的私有成员)
?>
输出效果
妹子
妹子

00x2 案例二__set

__set该魔术方法会在要修改一个封装属性的时候自动调用。CODE如下所示

注:

  该函数至少需要两个参数。

<?php
/**
* 劝君莫惜金缕衣,劝君珍惜少年时!
*/
class Human
{
private $name;
private $sex;
private $age; function __construct($name,$sex,$age)
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
} function __set($x,$y)
{
echo "nihao<br />";
}
}
$a = new Human("王大牛","男",);
$a->name="xxxxxxxxxxxxxxxx";
?>
输出效果如下:
nihao

00x3 案例三__isset

<?php
class Human
{
public $name;
public $sex;
public $age; function __construct($name,$sex,$age)
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
} function __isset($x) #在此处声明一个__isset的魔术方法,当在类外部使用isset()函数测定私有成员$nm时,自动调用。
{
echo "你想判断我的".$x."属性存在不存在。<br />";
}
}
$a=new Human("成大牛","男",);
if(isset($a->xishaonian)){ #使用isset检测xishaonian这个成员是否在对象a里面。显而易见是不存在的。这时候就会调用__isset方法。
echo "存在";
}else{
echo "不存在";
}
?>
输出效果如下所示:
你想判断我的xishaonian属性存在不存在。
不存在

00x4 案例三__unset

<?php
/**
* 简单的说就是当外部使用unset对类内部进行删除某个私有成员的时候就会自动调用__unset函数。切记是private也就是私有成员!
*/
class Human
{
private $name;
private $sex;
private $age; public function __unset($x)
{
echo "我要努力学习技术成为一名网络安全大牛!";
}
}
$a=new Human("成大牛","男",);
unset($a->name); ?>

一个同时使用了四个魔术方法的案例:

该CODE来自:http://blog.csdn.net/ebw123/article/details/41699031
<?php
class Person {
private $name;
private $sex;
private $age;
public function __get($property_name) {
if(isset($this->$property_name))
{
return ($this->$property_name);
} else {
return (NULL);
}
}
public function __set($property_name, $value) {
$this->$property_name = $value;
}
public function __isset($nm) {
echo "isset()函数测定私有成员时,自动调用<br>";
return isset($this->$nm);
}
public function __unset($nm) {
echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>";
unset($this->$nm);
}
}
$p1 = new Person();
$p1->name = "this is a person name";
echo var_dump(isset($p1->name))."<br>";
echo $p1->name."<br>";
unset($p1->name);
echo $p1->name;

THE END