php魔术方法之(__get,__set,__unset,__isset,__call,__callStatic)

一、语法

public __set ( string $name , mixed $value ) : void

public __get ( string $name ) : mixed

public __isset ( string $name ) : bool

public __unset ( string $name ) : void

public __call ( string $name , array $arguments ) : mixed

public static __callStatic ( string $name , array $arguments ) : mixed

 说明:

 

在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

在对象中调用一个不可访问方法时,__call() 会被调用。

在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

 

参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。

$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数

 

二、示例

<?php

/**
 * 定义一个猫类
 */
class Cat {

	//定义一个属性
	private $name = null;

	// 构造函数
	function __construct(?string $name = null){
		print "__construct <br>\n";
		if(is_null($this->name)){
			$this->setName($name);
		}

		//就算执行下面方法 ,析构函数照样执行
		// exit();
		// die();
	}

	/**
	 * 输出名字
	 */
	public function getName(){
		echo "这是一只猫,名字叫{$this->name}。\n"."<br>";
	}

	/**
	 * 私有方法
	 */
	private function setName($name){
		$this->name = $name;
	}

	/**
	 * 私有方法
	 */
	private static function setStaticName($name){
		$this->name = $name;
	}

    //在给不可访问属性赋值时,__set() 会被调用。
    function __set($name , $value){
    	echo $name.'属性是私有属性,不可赋值为:'.$value."<br>";

    	return '__set';
    }

    //读取不可访问属性的值时,__get() 会被调用。
    function __get($name){
    	echo $name."属性是私有属性,不可读<br>";

    	return '__get';
    }

    //当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
    function __isset($name ){
    	echo $name."属性是私有属性,不可访问属性调用 isset() 或 empty()<br>";

    	return '__isset';
    }

    //当对不可访问属性调用 unset() 时,__unset() 会被调用。
    function __unset($name ){
    	echo $name."属性是私有属性,不可访问属性调用 unset()<br>";

    	return '__unset';
    }

    //当对不可访问属性调用 unset() 时,__unset() 会被调用。
    function __call($name ,$arg){
    	echo $name."属性是私有方法,不可访问<br>";

    	return '__call';
    }

    //当对不可访问属性调用 unset() 时,__unset() 会被调用。
    function __callStatic($name ,$arg){

    	echo $name."属性是私有静态方法,不可访问<br>";

    	return '__callStatic';
    }

    //析构函数  脚本结束时执行
	function __destruct() {
        print "__destruct 类名: ". __CLASS__."<br>";
    }

}


//实例化
$Cat = new Cat();  // 输出  __construct   

$Cat->getName(); //输出:这是一只猫,名字叫旺财。

$Cat->name = 3;   //触发:__set()  输出:name属性是私有属性,不可赋值为:3

$Cat->name;//触发:__get()  输出:name属性是私有属性,不可读

isset($Cat->name);  //触发:__isset() 输出:name属性是私有属性,不可访问属性调用 isset() 或 empty()

unset($Cat->name);//触发: __unset() 输出:name属性是私有属性,不可访问属性调用 unset()


$Cat->setName('旺财2'); //触发:__call() 输出:setName属性是私有方法,不可访问

Cat::setStaticName('旺财2'); //触发:__callStatic()  输出:setStaticName属性是私有静态方法,不可访问


// 脚本结束时 输出 : __destruct 类名:Cat

  

 

三、其他

想要了解更多,请前往:https://www.php.net/manual/zh/language.oop5.overloading.php#object.call

posted on 2021-04-09 11:29  narwhalYel  阅读(99)  评论(0)    收藏  举报