登录  /  注册
博主信息
博文 24
粉丝 2
评论 5
访问量 18154
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
属性重载魔术方法、回调执行函数方法的流程与方式,静态方法重载实现数据库链接调用--2019-10-8
木槿昔年的博客
原创
621人浏览过

 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

数据库链接调用


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学