get,set,call,callStatic魔术方法的实例
实例效果:
实例源码:
一、魔术方法:construct:
class Product{
public $name = '鞋子';
public $price = '99';
public function __construct($name,$price){
$this->name = $name;
$this->price = $price;
}
}
$p = new Product("帽子",33);
echo '商品:'. $p->name.'<br>';
echo '价格:'.$p->price.'元';
二、魔术方法:__get:
- __get:根据属性名称动态地生成对应的属性访问接口名称
- ucfirst() 函数把字符串中的首字符转换为大写
- method_exists — 检查类的方法是否存在
class Credit {
private $idNum;
private $age;
public function __construct($idNum,$age){
$this->idNum = $idNum;
$this->age = $age;
}
public function __get($name){
$method = 'get'.ucfirst($name);
return method_exists($this,$method) ? $this->$method():null;
}
private function getIdNum(){
return isset($this->idNum) ? '....'.mb_substr($this->idNum,2,3) : '身份证不合法';
}
private function getAge(){
return isset($this->age) ? $this->age : '年龄不合法';
}
}
$p = new Credit('202015198504054144',30);
echo $p->idNum.'<br>';
echo $p->age.'<br>';
三、使用__set()魔术方法:
- 将用户对属性的更新操作进行重定向
class Credit{
private $idNum;
private $age;
public function __construct($idNum,$age){
$this->idNum = $idNum;
$this->age = $age;
}
public function __set($name,$value){
$method = 'set' . ucfirst($name);
return method_exists($this,$method) ? $this->$method($value):null;
}
private function setIdNum($value){
return $this->idNum = strlen($value) == 18 ? $value : null;
}
private function setAge($value){
return $this->age = $value>0 && $value<200 ? $value :null;
}
}
$p->idNum = '341215198504054148';
echo $p->idNum.'<br>';
$p->age = 30;
echo $p->age;
四、方法重载 (方法拦截器):call,callStatic
- 方法重载 (方法拦截器):call,callStatic,PHP中的魔术方法,是系统在特定时刻自动- 在类内部调用本类当中的一个不可访问的方法时,不管是对象方式,还是静态方式,都只能触发__call()方法
- 在类外部调用一个类中的一个不可访问的方法时,对象方式就触发call()方法,静态方式就触发callStatic()方法
- printf() 函数输出格式化的字符串。
class User{
public function __call(string $name,array $args){
printf('方法名:%s(),参数[%s]',$name,implode(',',$args));
}
public static function __callStatic(string $name,array $args){
printf('方法名:%s(),参数[%s]',$name,implode(',',$args));
}
}
$user = new User;
$user->hello('z','f','g');
echo '<hr>';
User::demo(2011,2012,2013);