Blogger Information
Blog 24
fans 2
comment 5
visits 19013
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
属性重载魔术方法、回调执行函数方法的流程与方式,静态方法重载实现数据库链接调用--2019-10-8
木槿昔年的博客
Original
655 people have browsed it

 10月8日作业
1. 实例演示四个属性重载的魔术方法的使用方式
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
3. 实例演示方法重载的实现原理与参数获取方式
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)

属性重载魔术方法的使用 : __get(), __set(), __isset(), __unset()

实例

<?php
namespace moshu;

//属性重载魔术方法的使用  __get(), __set(), __isset(), __unset()
// 魔术方法: 不需要或不允许用户调用,由系统来调用,

class Demo
{
	public $age;
	private $name; //私有的属性 名字
	private $salary; //私有的属性 工资
	protected $secert = 'PHP中文网的朱老师和猪哥不是同一个人'; //受保护的属性
	
	public function __construct($name, $salary)
	{
		$this->name = $name;
		$this->salary = $salary;
	}
	
	
	//__get()魔术方法是读操作,重载用户对属性的访问
	public function __get($a)
	{
		return $this->$a;
	}
	
	//__set($name,$value)魔术方法,写操作
	public function __set($name, $value)
	{
		return $this->$name = $value;
	}
	
	//__isset($name),__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
	public function __isset($name)
	{
		echo('我被调用了');
		return isset($this->$name);
	}
	
	public function __unset($name)
	{
		echo('我被调用了删除操作');
		unset($this->$name); //unset()方法没有返回值.
	}
	
}
	$obj = new Demo('朱老师', 9999);
	echo $obj->name.'<br>';
	echo $obj->salary.'<br>';
	echo $obj->secert.'<br>';
	//是私有属性,类外部不能直接访问,当使用__get();方法重载后,可以输出变量了
	
	//设置$name为欧阳老师
	$obj->name = '欧阳老师';
	
	//如果没有用到__set()方法重载,会报错
	//Fatal error: Uncaught Error: Cannot access private property moshu\Demo::$name 
	echo $obj->name.'<br>';
	
	echo isset($obj->obj)? '属性存在' : '属性不存在';
	echo('<hr>');
	echo empty($obj->secert)? '属性不存在' : '属性存在';
	echo('<hr>');
	//访问到了公共属性,__isset()不被调用
	echo isset($obj->age)? '属性存在' : '属性不存在';
	
	echo('<hr>');
	unset($obj->name);
	
	echo($obj->name);
	//删除私有属性后,不能访问
	//Notice: Undefined property: moshu\Demo::$name
	
?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

6666.jpg

call_user_func_array()回调执行函数/对象/类的方法的流程与方式

实例

<?php
	namespace func;
	
	function sum ($a, $b){
		return "{$a} + {$b} = ".($a+$b).'<br>';
	}
	
	//回调执行函数的方式
	echo call_user_func('\func\sum',30,40);
	
	echo call_user_func(__NAMESPACE__.'\sum',10,20);
	
	echo call_user_func_array(__NAMESPACE__.'\sum',[30,50]);
	
	
	//回调执行对象\类的方法的方式
	class Test {
		
		public	function sum ($a, $b){
			return "{$a} + {$b} = ".($a+$b).'<br>';
		}
		
		public static function sum2 ($a, $b){
			return "{$a} + {$b} = ".($a+$b).'<br>';
		}
	}
	
	//实例化类
	$obj = new Test();
	echo call_user_func_array([$obj,'sum'],[30,60]);
	echo call_user_func_array([new Test(),'sum'],[30,60]);
	echo '<hr>';
	
	//调用类里面的静态方法
	echo call_user_func_array(__NAMESPACE__.'\Test::sum2',[40,60]);
	
	//::class  ,  返回一个带有命名空间的类名称
	echo Test::class.'<br>'; 
	
	//使用::class后面跟的是静态方法
	echo call_user_func_array([Test::class,'sum2'],[50,60]);
	
?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

5555555.jpg

实例演示方法重载的实现原理与参数获取方式

实例

<?php
namespace func2;

//方法重载
class Test2 {
	
	// __call(): 访问一个不存在或无权限访问的方法的时候会自动调用
	//$name 方法名
	//$args 参数数组
	public function __call($name, $args){
		return '调用的方法'.$name.'不存在<br>参数<pre>'.print_r($args,true);
	}
	
	//静态方法重载
	public function __callStatic($name, $args){
		return '调用的方法'.$name.'不存在<br>参数<pre>'.print_r($args,true);
	}
}

$obj = new Test2();

echo $obj->name('朱老师',29);
echo '<hr>';
echo Test2::name('欧阳老师',18);

?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

88888.jpg

数据库链接调用


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments