使用后期静态绑定可以解决继承中方法的调用问题。
属性和方法的重载,可以使程序更加健壮,实现一些复杂的访问控制
1.方法调用的后期静态绑定
- 使用场景:父类方法中调用了另一个方法,而另一个方法在子类中重写了,子类在调用时需要调用自己重写的方法
- 方法:使用
static::
关键字静态绑定当前调用的类
<?php
//后期静态绑定
class demo1
{
//为每个参数两端加上*号
public static function myStr(array $arr){
return array_map(function($item){return "*".$item."*";},$arr);
}
public static function arr(array $arr){
//去掉两端空白
$arr = array_map(function($item){return trim($item);},$arr);
//static静态调用myStr方法
return static::myStr($arr);
//self调用myStr方法
//return self::myStr($arr);
}
}
class demo2 extends demo1
{
//重写myStr方法,为每个参数两端加上`号
public static function myStr(array $arr){
return array_map(function($item){return "`".$item."`";},$arr);
}
}
//父类demo1中使用self调用时,调用的是父类中的myStr方法
print_r(demo2::arr([' 343 ',' sdgs','dsgd']));
//输出:Array ( [0] => *343* [1] => *sdgs* [2] => *dsgd* )
//父类demo1中使用static调用时,调用的是子类中重写的myStr方法
print_r(demo2::arr([' 343 ',' sdgs','dsgd']));
//输出:Array ( [0] => `343` [1] => `sdgs` [2] => `dsgd` )
2.重载/拦截处理
- 对外部访问类属性和方法进行拦截处理
2.1 属性的重载
- 在外部查询类的属性值,设置属性值以及检测属性和销毁属性时,使用魔术方法
__get()
、__set()
、__isset()
、__unset()
进行拦截处理
<?php
//属性重载/拦截处理
class demo3
{
public static $cardNo = '40124934052856029';
private static $cardName = 'jack';
public static $cardDate = '135145009433';
//查询属性时进行处理
public function __get($name){
switch($name){
case 'cardName':return self::$cardName;
case 'cardDate':return self::$cardDate;
case 'cardNo':return substr(self::$cardNo,0,6).'****'.substr(self::$cardNo,-4,4);
}
}
//设置属性值时处理
public function __set($name,$val){
if($name == 'cardName') self::$cardName = trim($val) ;
if($name == 'cardNo'){
self::$cardNo = is_numeric($val)?$val:'0';
}
}
public function __isset($name)
{
return ($name==='cardNo'||$name==='cardName')?1:0;
}
public function __unset($name)
{
if($name==='cardDate'){self::$cardDate='111fhd';}
}
}
$card = new demo3;
//访问拦截处理
echo $card->cardNo,'<br>';//401249****6029
//设置拦截处理
$card->cardNo = 'hd00300';
echo $card->cardNo,'<br>';//0****0
//属性检测拦截处理
echo isset($card->cardDate)?'在':'不在','<br>';//不在
echo isset($card->cardName)?'在':'不在','<br>';//在
//属性销毁拦截处理
echo $card->cardDate,'<br>';//135145009433
unset($card->cardDate);
echo $card->cardDate;//111fhd
2.2 方法重载
- 调用不存在的方法时,通过
__call
、__callstatic
进行处理 __call
:普通方法、__callstatic
:静态方法
<?php
//方法重载/拦截处理
//调用一个不存在的方法时自动调用
class demo4
{
public function index(){
echo '已定义的方法';
}
public function __call($name,$arg){
echo '方法'.$name .'不存在';
}
public static function __callStatic($name, $arguments)
{
echo '静态方法'.$name .'不存在';
}
}
demo4::login();//静态方法login不存在
$obj = new demo4;
$obj->login();//方法login不存在
$obj->index();//已定义的方法