在 PHP 的类内部使用时,traits 中的静态变量如何不失去其价值?

you*_*ana 5 php oop static traits

尽管特征是语言辅助的复制/粘贴,但特征中的静态属性如何在被类使用时不会失去其价值?让我们考虑下面的例子,

     trait Test{
    public static $var = 1;

   public static  function increment(){
        self::$var ++;
        var_dump(self::$var);
    }
}


Test::increment();//2



class Test2{

    use Test;

}

var_dump(Test2::$var);//2
Test2::increment();//3
Run Code Online (Sandbox Code Playgroud)

这种行为在子级扩展父级的继承中是正确的,因此子级使用父级静态变量,但根据应用复制和粘贴的特征,这如何工作和正确?


这是一个更新,增加了我的困惑的另一个原因,如果静态值保留给特定的上下文,如特定的类或函数,那么我如何能够使用来自不同上下文(新类)的静态属性的更新值. 我的意思是,如果 trait Test 的上下文被称为例如 Context1,而类 Test2 上下文被称为 Context2,我如何在另一个上下文中访问第一个上下文的保留值?这与我们理解的上下文方法背道而驰。


更新 3:所有这些混淆都取决于 use 关键字是在类中导入特征成员还是复制/粘贴?

Kas*_*lek -1

来自特征文档

Trait 与类类似,但仅旨在以细粒度且一致的方式对功能进行分组。不可能单独实例化 Trait。它是对传统继承的补充,可以实现行为的水平组合;即应用类成员而不需要继承

您不能单独实例化 Trait,也不能定义 Trait 正在使用的属性,因为它们会发生冲突,这是因为 Trait 将此功能“添加”到您要附加到的类中。