php Trait基类use trait,本类不use

一 回顾trait使用

https://blog.csdn.net/bushuwei/article/details/103514174
发现之前本人说明很模糊,自己居然不知道为什么
其实这里的$c,就是class B
再次回顾逻辑

二 分析

  • self和static区别说的没毛病
  • Trait基类use trait,本类不use。那么如果用的new self,则你new 出来的就是 use trait者。如果new static,则因为有继承关系, 它会判断类是否存在(父子会被认为都是同一个static,则不再new),那么,谁先调用instance,那么new出来的就是谁。‘Trait基类use trait,本类不use’->直接‘其实这里的$c,就是class B’是错的。之所以有这个‘幻觉’,是因为单例模式,且static

三 上代码

  1. self+单例
    trait A{
        private static $instance;
        static function getInstance()
        {
            if(!isset(self::$instance)){
                self::$instance = new self();
            }
            return self::$instance;
        }
    }
    
    class B{
        use A;
        function a()
        {
            var_dump('call at B');
        }
    }
     
    class C extends B{
        function a()
        {
            var_dump('call at c');
            parent::a();
        }
    }
     
    class D extends B{
        use A;
        function a()
        {
            var_dump('call at D');
            parent::a(); 
        }
    }
    $b = B::getInstance();
    $c = C::getInstance();
    $d = D::getInstance();
     
    $c->a();
    echo "<br/>";
    $d->a();
    echo "<br/>";
    

      

    string(9) "call at B"
    string(9) "call at D" string(9) "call at B" 

    注视掉

    // $b = B::getInstance();
    结果不变
  2. static+单例
    trait A{
        private static $instance;
        static function getInstance()
        {
            if(!isset(self::$instance)){
                self::$instance = new static();
            }
            return self::$instance;
        }
    }
    
    class B{
        use A;
        function a()
        {
            var_dump('call at B');
        }
    }
     
    class C extends B{
        function a()
        {
            var_dump('call at c');
            parent::a();
        }
    }
     
    class D extends B{
        use A;
        function a()
        {
            var_dump('call at D');
            parent::a(); 
        }
    }
    $b = B::getInstance();
    $c = C::getInstance();
    $d = D::getInstance();
     
    $c->a();
    echo "<br/>";
    $d->a();
    echo "<br/>";
    
    string(9) "call at B"
    string(9) "call at D" string(9) "call at B" 
    

     

    注视掉

    // $b = B::getInstance();
    string(9) "call at c" string(9) "call at B"
    string(9) "call at D" string(9) "call at B" 

     

  3. 
    

     self+非单例

      

    trait A{
        private static $instance;
        static function getInstance()
        {
            self::$instance = new self();
            return self::$instance;
        }
    }
    
    class B{
        use A;
        function a()
        {
            var_dump('call at B');
        }
    }
     
    class C extends B{
        function a()
        {
            var_dump('call at c');
            parent::a();
        }
    }
     
    class D extends B{
        use A;
        function a()
        {
            var_dump('call at D');
            parent::a(); 
        }
    }
    $b = B::getInstance();
    $c = C::getInstance();
    $d = D::getInstance();
     
    $c->a();
    echo "<br/>";
    $d->a();
    echo "<br/>";
    

      

    string(9) "call at B"
    string(9) "call at D" string(9) "call at B" 
    

      注释掉

    // $b = B::getInstance();

    结果不变

  4.  static+非单例
    trait A{
        private static $instance;
        static function getInstance()
        {
            // if(!isset(self::$instance)){
            //     self::$instance = new static();
            // }
            // return self::$instance;
            self::$instance = new static();
            return self::$instance;
        }
    }
    
    class B{
        use A;
        function a()
        {
            var_dump('call at B');
        }
    }
     
    class C extends B{
        function a()
        {
            var_dump('call at c');
            parent::a();
        }
    }
     
    class D extends B{
        use A;
        function a()
        {
            var_dump('call at D');
            parent::a(); 
        }
    }
    $b = B::getInstance();
    $c = C::getInstance();
    $d = D::getInstance();
     
    $c->a();
    echo "<br/>";
    $d->a();
    echo "<br/>";
    

      

    string(9) "call at c" string(9) "call at B"
    string(9) "call at D" string(9) "call at B" 
    

      注释掉
    $b = B::getInstance();
    结果不变

四 结论

  • self的话,就是谁use的,就是谁
  • static的话,谁调用的就是谁
  • 但是static会出现‘谁use就是谁’的幻觉,那是因为单例模式,前面创建了相同类型的单例。

原文链接:https://www.cnblogs.com/bushuwei/p/17277267.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php Trait基类use trait,本类不use - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析

    PHP截取字符串函数substr, iconv_substr, mb_substr示例以及优劣分析 在PHP开发中,截取一个字符串是一项常见的操作。PHP提供了几种截取字符串的函数,如substr, iconv_substr和mb_substr。我们可以使用这些函数来截取字符串,并可以根据实际情况选择最合适的函数。 substr substr()函数是PHP…

    PHP 2023年5月26日
    00
  • 微信小程序框架的页面布局代码

    下面我会详细讲解“微信小程序框架的页面布局代码”的完整攻略。 什么是页面布局代码? 页面布局代码是指微信小程序框架中,用于构建小程序页面的代码。页面布局代码主要由WXML和WXSS两部分组成,其中WXML用于描述页面的结构,WXSS用于描述页面的样式。 WXML的页面布局代码 WXML是一种类似于HTML的语言,用于描述小程序页面的结构。它由标签、属性和数据…

    PHP 2023年5月23日
    00
  • 简单谈谈PHP vs Node.js

    简单谈谈PHP vs Node.js 前言 本文旨在探讨PHP和Node.js这两种Web开发语言的异同,并提供一些使用示例供读者参考。本文并非对PHP和Node.js的全面对比,仅供参考。 PHP和Node.js的异同 PHP和Node.js都是用于Web开发的语言,但它们的设计理念和实现方式却有很大的差异。下面我们将从几个方面来简单谈谈它们的异同。 编程…

    PHP 2023年5月26日
    00
  • PHP操作数组相关函数

    下面是PHP操作数组相关函数的完整攻略。 什么是数组 PHP数组是一种特殊类型的变量,可以存储多个值,每个值都有一个对应的索引,这个索引可以是数字或字符串。数组通常用于存储数据集合,如一组用户信息,一组选项等等。 数组的创建与初始化 在PHP中,可以使用array、[]或array()函数创建数组。如下所示: //使用array函数创建数组: $arr1 =…

    PHP 2023年5月26日
    00
  • php下的原生ajax请求用法实例分析

    下面是关于“php下的原生ajax请求用法实例分析”的完整攻略。 什么是原生ajax请求? 在介绍原生ajax请求的用法之前,我们需要先了解什么是ajax。AJAX(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术。它能够在不刷新页面的情况下从服务器加载数据,并可以在页面上进行实时更新。 原生ajax请求,指的…

    PHP 2023年5月26日
    00
  • php实现简单加入购物车功能

    下面是“php实现简单加入购物车功能”的完整攻略: 简介 购物车是电商网站非常重要的一个功能,能够方便用户选购商品并统一结算,提高用户购物体验。本文将介绍如何使用php实现简单的加入购物车功能。 实现过程 步骤一:创建购物车页面 首先我们需要创建一个购物车页面,并在页面上显示加入购物车的按钮。下面是一个简单的例子: <!DOCTYPE html>…

    PHP 2023年5月27日
    00
  • PHP实现PDF转图片的方法详解

    以下是使用PHP实现PDF转图片的方法详解,包含两个示例: 步骤 使用PHP实现PDF转图片的步骤: 安装ImageMagick ImageMagick是种开源软件套件,可以用来创建、编辑转换图像。在使用PHP将PDF转换为图片时,需要安装ImageMagick。 在Ubuntu上,可以使用以下命令安装ImageMagick: sudo apt-get in…

    PHP 2023年5月12日
    00
  • 微信小程序实现图片放大预览功能

    下面是“微信小程序实现图片放大预览功能”的完整攻略: 1. 使用自带组件<image>展示图片 我们可以使用小程序自带的<image>组件来展示图片,示例代码如下: <image src="{{imageUrl}}"></image> 其中imageUrl为图片的网络链接或本地临时文件路径。…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部