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 学习笔记第1/2页

    “php 学习笔记第1/2页”是一个用来学习PHP编程语言的笔记教程。以下是完整攻略: 1. 简介 在阅读“php 学习笔记第1/2页”之前,需要先了解一些基本的HTML和Web开发知识。本教程将带领读者逐步学习PHP的基本语法和常用函数,以及如何将PHP应用到Web开发中。 2. 基本语法 2.1 变量 在PHP中,变量以$符号开头。变量名可以包含字母、数…

    PHP 2023年5月23日
    00
  • PHP实现猜数游戏

    以下是“PHP实现猜数游戏”的完整攻略,包括游戏规则、实现步骤和两条示例说明。 游戏规则 猜数游戏是一款经典的游戏,玩法非常简单。游戏开始后,系统会随机生成一个固定的数字,然后用户需要输入猜测的数字,如果猜测的数字与系统生成的数字相同,那么游戏胜利;否则,系统会提示玩家需要继续猜测更大或者更小的数字。 实现步骤 以下是猜数游戏的实现步骤: 1. 实现表单 首…

    PHP 2023年5月27日
    00
  • PHP实现两种排课方式

    下面详细讲解一下如何使用PHP实现两种排课方式的完整攻略。 排课方式一:全排列 全排列是一种排列方式,可以将一组元素的所有排列都找出来。在排课中,我们可以将每一节课看做一个元素,使用全排列的方式可以找到所有上课的可能性。 下面是使用PHP实现全排列排课的示例代码: function permute($arr, $temp, &$result) { i…

    PHP 2023年5月23日
    00
  • php输出全部gb2312编码内的汉字方法

    要输出gb2312编码内的汉字,首先需要设置php文件的字符编码为gb2312。可以通过以下代码进行设置。 header("Content-Type:text/html;charset=gb2312"); 接着,需要将汉字转换为gb2312编码。可以使用iconv函数进行转换,示例如下。 $hanzi = "你好,世界&quot…

    PHP 2023年5月26日
    00
  • MySql数据库查询结果用表格输出PHP代码示例

    下面给出详细讲解”MySql数据库查询结果用表格输出PHP代码示例”的完整攻略。该攻略包含以下步骤: 连接数据库 使用PHP连接到MySql数据库,获取数据库连接对象。示例代码如下: // 连接数据库 $conn = mysqli_connect($servername, $username, $password, $dbname); if (!$conn)…

    PHP 2023年5月26日
    00
  • PHP警告Cannot use a scalar value as an array的解决方法

    问题描述: 在使用PHP进行开发时,我们有时会遇到下面这个错误提示: Warning: Cannot use a scalar value as an array in xxx.php on line xxx 这个提示意味着我们在将一个标量类型的值视为数组时(例如一个字符串或数字),PHP会发出此警告,因为它无法遵循这种转换。 解决方法: 检查变量是否是数组…

    PHP 2023年5月23日
    00
  • PHP实现网络请求的方法总结

    以下是“PHP实现网络请求的方法总结”的完整攻略。 一、背景知识 在进行网络请求前,需要了解HTTP协议相关知识,例如HTTP的请求方法、请求头、请求体以及响应头、响应体等内容。此外,还需要了解HTTP状态码的含义,例如200表示请求成功,404表示请求的资源未找到等。 二、实现方法 1. curl方法 curl是一种用于网络传输的工具,可以通过它发送各种H…

    PHP 2023年5月27日
    00
  • php的list()的一步操作给一组变量进行赋值的使用

    list() 函数是一个用于将数组中的值赋给一组变量的 PHP 函数。可以说,这是一种批量赋值的方式。接下来,我将详细讲解 list() 函数的使用方法。 基本语法 list($var1, $var2, …) = array(expression1, expression2, …); 可以看到,list() 函数的基本语法非常简单,以一组变量名作为左…

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