php类的__set()、__get()、__isset()、__unset()、__call()、__callStatic()、__invoke()

1.__set()、__get() 应用

通过类中定义__set()、__get()魔术方法可以避免多个成员变量重复去定义get、set方法。

  • 使用原理当外部设置 $UserAppIndex->username=‘华山论剑’; 时调用 __set() 。
  • $UserAppIndex->username; 时调用__get()方法

注:这些魔术方法的参数都不能通过引用传递。重载方法都必须被声明为 public。


	//定义
	class Index
	{
	    private $username='';
		private $password='';
		
	    public function __set($name, $value)
	    {
	        $this->$name=$value;
	    }
	    public function __get($name)
	    {
	        return $this->$name;
	    }
	
	    public function __construct()
	    {
	        echo '这是 UserApp\Index';
	    }
	}
	
	//调用
	$UserAppIndex = new Index();
	$UserAppIndex->username='华山论剑';
	echo $UserAppIndex->username;
	
2. __isset() 和 __unset()

5.1.0 新增 __isset() 和 __unset()

当类中成员变量不能外部访问,会自动调用 __isset()方法,这样可以直接在魔术方法中判断成员变量是否存在,
同样,你想删除成员变量会调用__unset()执行删除操作

	//定义
	class Index
	{
	    private $username = '';
	    private $password = '';
	
	    public function __isset($name)
	    {
	        return isset($this->$name) ? true : false;
	    }
	
	    public function __unset($name)
	    {
	         unset($this->$name);
	    }
	
	    public function __construct()
	    {
	        echo '这是 UserApp\Index';
	    }
	}
	//调用
	$UserAppIndex = new Index();
	var_dump(isset($UserAppIndex->username));
	unset($UserAppIndex->password );
	
3.__call()、__callStatic()

当调用方法不存在时避免产生错误类会自动调用__call()。
一样当静态方法不存在避免错误类自动调用__callStatic() ,__callStatic()必须为静态方法


	//定义
	class Index
	{
	    private $username = '';
	    private $password = '';
	
	    public function __call($name, $arguments)
	    {
	        echo '您调用的函数'.$name. '不存在,' .json_encode($arguments) .'为函数的参数';
	    }
	    public static function __callStatic($name, $arguments)
	    {
	        echo '静态方法'.$name. '不存在,' .json_encode($arguments) .'为函数的参数';
	    }
		
	    public function __construct()
	    {
	        echo '这是 UserApp\Index';
	    }
	}
	//调用,下面调用直接输出
	$UserAppIndex = new Index();
	$UserAppIndex->go();//您调用的函数go不存在,[]为函数的参数
	$UserAppIndex::to();//静态方法to不存在,[]为函数的参数
	
4.__invoke()

当把对象当函数使用时候,自动调用__invoke() 下面示例说明

	//定义
	class Index
	{
	    private $username = '';
	    private $password = '';
	
	    public function __invoke($arguments)
	    {
	        echo '该函数的参数为:'.$arguments;
	    }
	
	    public function __construct()
	    {
	        echo '这是 UserApp\Index';
	    }
	}
	//调用
	$UserAppIndex = new Index();
	$UserAppIndex(123123); //该函数的参数为:123123
	
5.__toString()

这个方法可以用来测试,用echo、print

	//定义
	class Index
	{
	    private $username = '';
	    private $password = '';
	
	    public function __toString()
	    {
	        return '我是tostring方法';
	    }
	
	    public function __construct()
	    {
	        echo '这是 UserApp\Index';
	    }
	}
	//调用
	echo ($UserAppIndex);
	
6.__clone()的使用方法点击查看

猜你喜欢

转载自blog.csdn.net/qq_39043923/article/details/88812023