开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:PHP 方法重载】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/712/detail/12713
PHP 方法重载
内容介绍:
一、目标
二、概念
三、示例
一、小结
一、目标
理解方法重载的原理,利用这些原理解决容错性的问题,掌握方法重载的实现
二、概念
PHP 方法重载:对象或者类访问不存在或者权限不够的方法时,自动触发的魔术方法让代码不出错(容错处理)
1.方法重载魔术方法
__call (方法名,方法参数列表):调用不存在或者权限不够的方法时触发
__callStatic (方法名;方法参数列表):调用不存在或者权限不够的静态方法时触发
三、示例
1.方法重载
class Man{
private function show(){
echo _
M
ETHOD__, '
';
}
private static function staticshow({
echo __METHOD__,'
';
}
#普通方法重载
public function __cal
l
($name
,
$
args
){
echo $name,_METHOD__,'
';
}
#静态方法重载
public static function __cal
l
static($name
,
$
args
){
echo $name,__METHOD__,'br/> ';
}
}
#访问不可访问的方法
Man: :staticshow
()
;
$m = new Man();
$m->show();
Man 类里有两个私有方法 show 和 staticshow,这两个方法是不能在外面访问的,但是增加 __call 之后会触发这个方法。
#PHP 重载:方法重载
cLass Man{
private function show(){
echo __METHOD__,'
';
}
private static function staticShow(){
echo __METHOD__,'
';
}
}
这里面会有这两个方法,不管用哪种方法都是访问不了的,因为这是私有方法。
此时如果加入方法重载,就不会报错。
class Man{
private function show(
)
{
echo __METHOD__ ,'
';
}
#普通方法重载
public function __call($name , $args){
echo $name,__METHOD__,'
';
}
private static function staticShow(){
echo __METHOD__ , '
';
}
}
#Man: :staticshow();
$m = new Man(
)
;
$m->show();
再调用一次,传入四个的参数1,2,3,4,然后打印一个结果
var_dump($args);
运行将所有的参数放入了一个数组
但是这种方法不会触发静态,静态还是报错,因此静态也需要一个同样的内容。添加静态方法重载后同样不报错。
#静态方法重载
public static function __cal
l
static($name
,
$
args
){
echo $name,__METHOD__,'br/> ';
}
2. }
3. 方法重载的主要目的
不让外部访问出错。当然,如果必要时也可以进行内部访问
class Man{
private function show(
)
{
echo _METHOD__, '
';
}
private static function staticshow(){
echo _METHOD__,'
';
}
#方法重载
public function __ca
ll
($name , $args){
#允许访问列表
$allow = array( ' show ' );
#判定是否在列表中
if(in_array(Sname,$allow)) return $this->$name(implode($args,' , '));
#其他情况
return false;
}
public static function _callstatic($name , $args){
#不允许访问
return false;
}
如果有一个 show 方法是允许访问的,如果判定在列表中,就去内部调用这个方法,$this->$name 意味着调用了方法的名字,加括号系统会理解为这是一个函数,就会去运行,运行去找 show 方法,show 方法里把参数传进去,参数是外部传进来然后用逗号分隔组成字符串,放到里面就相当于一个参数列表。
#允许访问列表
$a
l
low = array( ' show ' );
#判定是否在列表中
if(in_array(Sname,$allow)) return $this->$name(implode($args,' , '));
#其他情况
return false;
Show 之前拿到的结果是只调用了方法,并没有拿到任何结果,但是现在 man::show 这两个方法都真正的 show 方法被调用,之前调用的只是魔术方法。现在实现了两次调用,并没有触发 staticshow,因为里面没有实现。
同样的不单单做了容错处理,还做了内部控制,可以做到精确化控制有些允许访问有些不允许访问,甚至内部应该怎么访问。
四、小结
1、PHP 方法重载是用来控制外部对类中方法的错误访问而设定的一种容错处理
PHP 方法重载的本质是实现一种错误的优雅处理,出错了之后在内部输出错误。整个 PHP 的重载都是一种容错以及内部处理的方式。