博客列表 >新的概念:php后期静态绑定与重载/拦截器的所有方法

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

emy
emy原创
2020年05月11日 06:04:56601浏览

一、后期静态绑定的原理与实现:
后期静态绑定的功能,用于在继承范围内引用静态调用的类。“后期绑定”的意思是说,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

运行结果:

QQ截图20200511052129.jpg

二、构造器
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);

运行结果:

QQ截图20200511053602.jpg

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

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

<?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 '<hr>';
    echo $p->nation;
    echo '<hr>';
    echo $p->city;
    echo '<hr>';
    $p->nation = 'korea';
    $p->city = 'yunfo';
    echo $p->nation;
    echo '<hr>';
    echo $p->city;
    echo '<hr>';
    var_dump(isset($p->nation));
    echo '<hr>';
    unset($p->nation);
    var_dump(isset($p->nation));

运行结果:
QQ截图20200511055356.jpg
四、方法重载/拦截器的所有方法:

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

<?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 '<br>';
    Demo::Demo(6,7,8,9);

运行结果:
QQ截图20200511060007.jpg

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议