Blogger Information
Blog 31
fans 0
comment 0
visits 30164
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
新的概念:php后期静态绑定与重载/拦截器的所有方法
emy
Original
600 people have browsed it

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

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:对于有一定编程基础的来说, 这些概念也是有点难理解的.... , 但是, 一旦掌握 , 可以极大的提高代码的质量, 所以, 还是有必要花时间去研究的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post