版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25275355/article/details/78485573
__isset() – 在对类中属性或者非类中属性使用isset()方法的时候如果
没有
或者
非公有属性
,则自动执行__isset()的方法(
简单理解除了属性public 以外都掉用
)
__unset() - 在对类中属性或者非类中属性使用unset()方法的时候如果没有或者非公有属性,则自动执行__unset()的方法
<?php
/*
__isset格式:bool __isset(string name) //传入对象中的成员属性名作为参数,返回测定的结果
作用 :在类的外部使用“isset()”方法测定对象中的成员时,
就会自动调用对象中的“__isset()”方法,
间接地帮助我们完成对对象中私有成员属性的测定
直接在外部 isset(私有属性) 由于访问不了私有属性返回 false(即使该私有属性有值)
应用__isset( ),在外部执行
isset(私有属性),就会自动调用对象中的“__isset()”方法,
然后 我们既可以在 __isset()”方法内 isset(私有属性) 得到准确的值,
实现
间接地帮助我们完成对对象中私有成员属性的测定
__unset格式:void __unset(string name) //传入对象中的成员属性作为参数
作用 :可以将私有成员属性删除如果没有在类中加入此方法,
就不能删除对象中任何的私有成员属性。
*/
class Employee
{
private $name;
private $sex;
private $salary;
function __construct($name="",$sex="男",$salary=3000)
{
$this->name=$name;
$this->sex=$sex;
$this->salary=$salary;
}
function __isset($propertyName)
{
if($propertyName=="salary")//$propertyName是属性名的意思
return false;
return isset($this->$propertyName);
//
$
propertyName 是私有的外部不能直接判断 必须先通过__isset 进而就可以判断
//当在外面使用__isset()测定私有成员属性时,__unset方法被自动调用
//并在内部把私有的成员属性删除
}
function __unset($propertyName)
{
if ($propertyName=="salary" || $propertyName=="name")
return;
unset($this->$propertyName);
}
public function getInfo()
{
echo "我的名字:".$this->name.",性别:".$this->sex.",工资:".$this->salary."<br>";
}
}
$e=new Employee("奥巴马","男",20000);
var_dump(isset($e->name));
echo "<br>";//输出bool为false,不允许测定name属性
var_dump(isset($e->sex));
echo "<br>";
var_dump(isset($e->salary));
echo "<br>";
var_dump(isset($e->id));//输出bool(false),测定对象中不存在id的属性
unset($e->sex);//删除对象中的私有属性sex 删除成功
unset($e->salary);//删除对象中私有属性salary,删除不成功
$e->getInfo();
?>
<?php
//属性重载
class
Person{
//属性
public
$name
;
private
$age
;
//构造方法
publicfunction
__construct(
$name
,
$age
) {
$this
->name =
$name
;
$this
->age =
$age
; } }
//实例化
$person
=
new
Person('罗纳尔多',35);
//判断
var_dump
(
isset
(
$person
->name));
//true
var_dump
(
isset
(
$person
->age));
//false
var_dump
(
empty
(
$person
->name));
//false
var_dump
(
empty
(
$person
->age));
//true
<?php
//属性重载
class
Person{
//属性
public
$name
;
private
$age
;
//构造方法
publicfunction
__construct(
$name
,
$age
) {
$this
->name =
$name
;
$this
->age =
$age
; }
//isset魔术方法 //需要一个参数知道要判断的属性的名字
public function
__isset(
$name
){
//新建一个允许判断的数据 //判断当前元素是否在允许判断的数组里 //如果允许,在内部判读,返回判断结果 //不允许,返回FALSE
var_dump
(
$name
);
returnisset
(
$this
->
$name
);
//return empty($this->$name) //empty和isset外部所得到的结果
}}
//实例化
$person
=
new
Person('罗纳尔多',35);
//判断
var_dump
(
isset
(
$person
->name));
//true 能访问到,不经过__isset()魔术方法
var_dump
(
isset
(
$person
->age));
//true 访问不到,经过__isset()魔术方法,判断出age属性是存在的,返回true
var_dump
(
empty
(
$person
->name));
//false 能访问到,不经过__isset()魔术方法
var_dump
(
empty
(
$person
->age));
//true 访问不到,经过__isset()魔术方法,判断出age属性是存在的,返回true(与逻辑不符,所以需要在__isset()函数内部做判断)
<?php
//魔术方法__isset __unset
echo
'<hr />'
;
class
Dog
{
public
$leg =
4
;
protected
$bone =
'猪腿骨'
;
publicfunction
__isset
($p){
echo
'你想判断我的'
,$p,
'属性存不存在<br />'
;
return
1
; }
publicfunction
__unset
($p){
echo
'你想去掉我的'
,$p,
'?!<br />'
; } } $hua =
new
Dog();
if
(
isset
($hua->leg)) {
echo
$hua->leg,
'<br/>'
; }
/*结果:4*/
if
(
isset
($hua->tail)) {
echo
'有tail属性'
; }
else
{
echo
'没有tail'
; }
/*结果:你想判断我的tail属性存不存在有tail属性*//*** __isset() 方法, 当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性) 会引发 __isset()来执行 问: isset($obj->xyz) 属性,为真, 能说明 类声明了一个xyz属性吗? 答:不能 ***/
echo
'<hr />'
;
echo
'__unset测试<br/>'
; print_r($hua);
/*结果:__unset测试Dog Object( [leg] => 4 [bone:protected] => 猪腿骨)*/
unset
($hua->leg); print_r($hua);
/*结果:Dog Object( [bone:protected] => 猪腿骨)*/
unset
($hua->tail);
unset
($hua->bone);
/*结果:你想去掉我的tail?!你想去掉我的bone?!*//*** __unset()方法 当 用unset 销毁对象的不可见属性时, 会引发 __unset(); unset($hua->tail)----没有tail属性---->__unset('tail'); ***/
?>