php8拦截器,新的概念:php后期静态绑定与重载/拦截器的所有方法

一、后期静态绑定的原理与实现:

后期静态绑定的功能,用于在继承范围内引用静态调用的类。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。

1-当实现类中2个函数功能相同时,可以写在抽象类中,抽象类不能实例化。

2-将类的定义与类的调用分离开。

3-用后期静态绑定,使用关键字static将self替换

self 始终与定义它的类绑定

static始终与调用它的类绑定<?php

abstract class A

{

public function write()

{

return new static();

}

public static function amount($geshu ,$pici)

{

return '出席的人:'.$amount = $geshu * $pici;

}

public static function index($geshu,$pici)

{

return static::amount($geshu,$pici);

}

}

class Base extends A

{

public static function amount($geshu, $pici)

{

return '实际出席的人有:'.$amount = $geshu * $pici *3;

}

}

class C extends A

{

}

echo Base::index(1000,5); //输出结果是 价格是:5000

//如果把class A中的index()方法中的self改成static,那么调用Base的index() 就与Base绑定

//最后输出的结果是 15000

运行结果:

8545088059909de1e026d8616e1119e1.png

二、构造器

1- 魔术方法:

2-语法: 类中有一些方法总是使用双下划线开头, 这就叫魔术方法

3-调用者: 由系统根据一定的条件或用户行为, 自动调用/触发, 禁止用户主动调用

4- 构造方法: __construct(), 是类的实例化过程中被自动调用, new 的时候,在类的实例化中被调用,功能就是生成一个新对象。<?php  //构造方法

class People

{

private $nation;

private $geshu;

public function __construct($nation,$geshu,$pici)

{

//1.生成一个新对象,类实例

//2.初始化对象

$this->nation = $nation;

$this->geshu = $geshu;

$this->pici = $pici;

$this->write();

}

public function write()

{

$sum  = $this->geshu * $this->pici;

echo "$this->nation 派出次数为$this->pici 次,每次与会人数是:$this->geshu 人,总共出席的人数是:$sum 人";

}

}

$product = new People('中国',200,3);

运行结果:

b1b94a67ede3a6af28012afa5a1eda29.png

三、属性重载/拦截器的所有方法:

当用户访问一个不存在或无权限的属性时,拦截器会拦截下来,进行处理。<?php

// 属性拦截器:拦截类外部属性访问

// 访问属性拦截器:__get()

// 设置属性拦截器:__set()

// 检测属性拦截器:__isset()

// 删除属性拦截器:__unset()

class Abs

{

private $nation = 'china';

private $city = 'foshan';

//创建访问属性拦截器

public function __get($num)

{

$a = 'get' . ucfirst($num);   // 把拦截到的数据当成参数赋值给$k

// 转发访问请求

return method_exists($this,$a) ? $this->$a():'';

}

// 方法1

private function getNation()

{

return $this->nation;

}

// 方法2

private function getCity()

{

return $this->city;

}

//创建设置属性拦截器

public function __set($name, $value)

{

$method = 'set' . ucfirst($name);

return method_exists($this,$method) ? $this->$method($value) : '';

}

// 方法1

private function setNation($value)

{

$this->nation = '这个国家叫:' . $value;

}

// 方法2

private function setCity($value)

{

$this->city = '这个城市叫:' . $value;

}

public function __isset($name)

{

return $name === 'nation' ? isset($this->nation) : 'false';

// return $name ===  $this->nation ? isset($this->nation) : false;//检查属性是否存在,如果存在就检查这个属性,否则打印空字符串

}

// 创建属性销毁拦截器

public function __unset($name)

{

unset($this->nation);

}

}

$p = new Abs;

echo '


';

echo $p->nation;

echo '


';

echo $p->city;

echo '


';

$p->nation = 'korea';

$p->city = 'yunfo';

echo $p->nation;

echo '


';

echo $p->city;

echo '


';

var_dump(isset($p->nation));

echo '


';

unset($p->nation);

var_dump(isset($p->nation));

运行结果:

addb7c7fde9ceea388032c681066816f.png

四、方法重载/拦截器的所有方法:

当用户调用一个不存在或者没有权限访问的方法或静态方法时,会拦截下来进行处理。<?php

// 方法拦截器

// __call(参数1 , 参数2):当工作端访问不存在或者无权限的方法时调用

// __callStatic(参数1 , 参数2):当工作端访问不存在或者无权限的‘静态’方法时调用

// 参数1:方法名称

// 参数2:传递给当前方法的参数列表

class Demo

{

// 方法拦截器

public function __call($name, $arguments)

{

printf('名: %s , 幸运数: [%s]', $name, implode(', ', $arguments));

}

// 静态方法拦截器

public static function __callStatic($name, $arguments)

{

printf('静态名: %s , 幸运数: [%s]', $name, implode(', ', $arguments));

}

}

$user = new Demo();

$user->demo(1,2,3,4);

echo '
';

Demo::Demo(6,7,8,9);

运行结果:

fbc1b5809a08d2321cd41badf6b9595b.png

五、总结:其实自己对这一块不是很熟悉,只能先说暂时先碰了个面。里面的例子基本都是仿写。只要动手去写了,还是有印象。在什么场合使用这些,还是要加强多听和多练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值