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将字符串首字母大小写转换的实例

    下面就是关于PHP将字符串首字母大小写转换的实例完整攻略。 1. 函数介绍 在PHP中提供了三个函数可以用于将字符串的首字母大小写进行转换,分别为: ucfirst($string):将字符串的首字母转换为大写 lcfirst($string):将字符串的首字母转换为小写 ucwords($string):将字符串中单词的首字母都转换为大写 这三个函数的用法…

    PHP 2023年5月26日
    00
  • PHP 实现explort() 功能的详解

    这里是关于 “PHP 实现 explode() 功能的详细攻略” 的完整说明: 1. 什么是 explode() 函数? explode() 函数是 PHP 中的一个用于字符串操作的函数,它能够将一个字符串按照指定的分隔符将其分割成多个子串,最终返回一个字符串数组。这个函数的语法如下: array explode ( string $delimiter , …

    PHP 2023年5月27日
    00
  • PHP实现一维数组转二维数组的方法

    PHP实现一维数组转二维数组的方法 方法一 在此方法中,我们将使用 array_chunk() 函数将一维数组转化为二维数组。此函数将会返回一个由指定大小的数组块组成的二维数组,其中每个数组块本身都是包含指定数量元素的一维数组。 代码示例: <?php // 原始一维数组 $fruits = array(‘apple’, ‘banana’, ‘oran…

    PHP 2023年5月26日
    00
  • php二维数组用键名分组相加实例函数

    这里是一份关于”php二维数组用键名分组相加实例函数”的攻略。 什么是php二维数组用键名分组相加? 在php中,二维数组是一种非常常见的数据类型。当我们需要对一些具有相同键名的数据进行处理时,我们需要将它们分组并相加,以得到每个组的总和。这时,就需要用到”php二维数组用键名分组相加”了。 如何实现? 在php中,我们可以使用foreach循环来遍历数组。…

    PHP 2023年5月26日
    00
  • PHP判断函数是否被定义的方法

    如果你想判断函数是否被定义,可以使用PHP内置函数 function_exists()。这个函数可以判断指定函数名是否已经被定义。如果函数已经被定义,那么返回true,否则返回false。 下面是一个示例代码,展示如何使用 function_exists() 判断指定函数是否被定义: if (function_exists(‘test’)) { echo &…

    PHP 2023年5月27日
    00
  • php去掉字符串的最后一个字符附substr()的用法

    当我们需要从一个字符串中去掉最后一个字符时,可以使用php的substr()函数来实现。这个函数的的主要用法是在一个字符串中截取指定长度的子字符串。 语法 substr(string $string , int $start [, int $length ] ) : string 参数说明 string: 必需,需要截取的原始字符串。 start: 必需,截…

    PHP 2023年5月26日
    00
  • PHP代码实现表单数据验证类

    下面是PHP代码实现表单数据验证类的完整攻略: 1. 确定验证规则 在创建表单数据验证类之前,首先需要确定需要验证哪些字段,以及需要进行哪些规则的验证。常见的表单数据验证规则包括: 必填字段验证:判断某些字段是否为空或者未填写; 数据格式验证:如email格式验证、电话号码格式验证、身份证号码格式验证、密码复杂度验证等; 数据长度验证:如用户名不能超过20个…

    PHP 2023年5月27日
    00
  • php 类中的常量、静态属性、非静态属性的区别

    PHP类中的常量、静态属性和非静态属性是常用的三种类成员变量。它们在类中扮演着不同的角色和承担不同的任务。下面我们来详细了解它们的区别和用法。 PHP类中的常量 常量是一种类成员变量,其值在定义之后不能改变。在PHP中使用 const 关键字定义常量。常量的命名规则与变量相同,但是一般情况下常量名用大写字母表示。常量可以在类定义中直接声明,也可以在类定义之外…

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