面向对象魔术方法

一  __get和__set

1.当去使用不可访问的属性时,系统就会调用__get方法    不可访问属性:该属性不存在   直接访问protected或private属性

2.当去给不可访问属性赋值时,会调用__set方法

<?php
echo '<meta charset="utf-8">';
class Monkey{
    public $name;
    protected $food;
    public function __construct($name,$food){
        $this->name = $name;
        $this->food = $food;
    }
    //魔术方法的名字是固定的
    //$pro_name形参 表示属性名
    public function __get($pro_name){
        //做一个判断 property_exists判断对象或类中是否有该属性
        if(property_exists($this,$pro_name)){
            return $this->$pro_name;
        }else{
            return '没有该属性,无法返回';
        }
    }
    //形式参数 属性名$pro_name 属性值$pro_val
    public function __set($pro_name,$pro_val){
        //做一个判断 property_exists判断对象或类中是否有该属性
        if(property_exists($this,$pro_name)){
            $this->$pro_name = $pro_val;
        }else{
            echo '属性不存在,无法赋值';
        }
    }
}
$Monkey1 = new Monkey('悟空','桃子');
//触发__get魔术方法
echo $Monkey1->name;
echo $Monkey1->food;
//触发__set魔术方法
$Monkey1->name = '孙悟空';
$Monkey1->food = '香蕉';
echo $Monkey1->name;
echo $Monkey1->food;

 二,__isset和__unset

1.当对不可访问的属性,进行了isset($对象名->属性名),empty($对象名->属性名),__isset函数就会被系统调用

2.当对不可访问的属性,进行了unset($对象名->属性名),__unset函数就会被系统调用

<?php
echo '<meta charset="utf-8">';
class Cat{
	public $name;
	private $food;
	public function __construct($name,$food){
		$this->name = $name;
		$this->food = $food;
	}
	public function __isset($pro_name){
		if(property_exists($this,$pro_name)){
			return true;
		}else{
			return false;
		}
	}
	public function __unset($pro_name){
		if(property_exists($this,$pro_name)){
			unset($this->$pro_name);
		}else{
			echo '属性不存在,无法删除';
		}
		
	}
}
$cat1 = new Cat('波斯猫','<。)#)))≦');
//判断name 属性是否存在
if(isset($cat1->name)){
	echo '<br>name 属性是存在的';
}else{
	echo '<br>name 属性是不存在的';
}
//判断food 属性是否存在
//此时food是私有属性 因此会调用__isset方法
if(isset($cat1->food)){
	echo '<br>food 属性是存在的';
}else{
	echo '<br>food 属性是不存在的';
}

//如果销毁的成员属性,是protected或者private的,就不能直接unset
//此时food是私有属性 因此会调用__unset方法
unset($cat1->name);
var_dump($cat1);
echo '<br>-------------------';
unset($cat1->food);
var_dump($cat1);

  三.__toString

当输出一个对象时,就会触发该函数

1.__toString没有形参

2.__toString要求返回一个字符串

3.当我们在项目开发时,需要找bug时,可以通过他输出对象信息

<?php
echo '<meta charset="utf-8">';
class Cat{
	public $name;
	private $food;
	public function __construct($name,$food){
		$this->name = $name;
		$this->food = $food;
	}
	public function __toString(){
		return '名字:'.$this->name.'食物:'.$this->food;
	}
}
$cat1 = new Cat('波斯猫','<。)#)))≦');
echo $cat1;

 property_exists(对象名,属性):

1.先判断该对象是否有这个属性,如果有则返回真

2.如果该对象没有此属性,则继续判断该对象对应的类是否定义过这个属性,如果类定义过,就返回真

三,__clone

当将一个对象完全的复制一份,保证两个对象的属性和属性值一样,但他们的数据空间独立,则可以使用对象克隆

1.克隆一个对象时,克隆方法里面可以修改属性的值

2.当不想被克隆时,将克隆方法private 例如:单例模式时

<?php
echo '<meta charset="utf-8">';
class Sheep{
	public $name;
	public $food;
	public function __construct($name,$food){
		$this->name = $name;
		$this->food = $food;
	}
	public function __clone(){
		//克隆一个对象时,克隆方法里面可以修改属性的值
		$this->food = '树叶';
	}
}
$sheep1 = new Sheep('羊','草');
//克隆一个对象 $sheep2 = clone $sheep1; var_dump($sheep1->food); var_dump($sheep2->food);

 

猜你喜欢

转载自www.cnblogs.com/wfc139/p/9152231.html
今日推荐