3种策略巧妙化解PHP Trait成员属性冲突

这篇具有很好参考价值的文章主要介绍了3种策略巧妙化解PHP Trait成员属性冲突。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

PHP语言本身可以用insteadof和as关键字解决多个trait同名成员方法冲突的问题,但是貌似没有直接解决同名成员属性冲突的方案。
虽然属性名冲突极少发生,但是不代表不会发生。

如果是自定义trait

  1. 可以复制旧trait文件到新trait,改新文件的成员属性名,引用新trait。
  2. 直接更改原trait成员属性名,可能会影响项目。

如果就不动原trait,仅通过类怎么解决?(例如某些trait在vendor下,极少的情况下需要同时引用多个trait,他们的属性冲突了)

示例

如下:C类想用A Trait和B Trait的方法,但是属性名冲突,报错。
Fatal error: A and B define the same property ($prop) in the composition of C. However, the definition differs and is considered incompatible. Class was composed。

trait A {
    public $prop = 'trait_a';
    public function speakEnglish() {
        echo 'English';
    }
}

trait B {
    public $prop = 'trait_b';
    public function speakChinese() {
        echo '中文';
    }
}

class C {
    use A,B;
}

$c = new C();
echo $c->prop;

错误的解决方案

PHP语言本身可以用insteadof和as关键字解决多个trait同名成员方法冲突的问题,但是这无法修饰成员属性。
报错:Fatal error: A precedence rule was defined for A::prop but this method does not exist.

class C {
    use A,B {
        A::prop insteadof B;
        B::prop as B_prop;
    }
}

$c = new C();
echo $c->prop;

正确的解决方案

  1. 需要一个父类参与,相当于一个中间人为冲突双方做调解。
  2. 并在父类中引入任意一个trait,相当于告诉这个trait停止冲突。
  3. 子类继承父类并引入另一个trait,并重新声明属性并赋初始值,相当于告诉另一个trait也停止冲突,而且支持你。
  4. 此时子类继承了家业又化解了冲突。
  5. 需要注意:C类中的public $prop = 'trait_b'不能少,且必须等于B trait中的值,否则会报致命错误。
trait A {
    public $prop = 'trait_a';
    public function speakEnglish() {
        echo 'English';
    }
}

trait B {
    public $prop = 'trait_b';
    public function speakChinese() {
        echo '中文';
    }
}

class P {
    use A;
}

class C  extends P {
    use B;
    public $prop = 'trait_b';
	//构造方法为非必填项
    public function __construct() {
        $this->prop = 'new value';
    }
}

$c = new C();
echo $c->prop;
$c->speakEnglish();
$c->speakChinese();

至此,使用父类可巧妙化解PHP Trait成员属性冲突的问题,让不能更改的两个trait,既不冲突,又能同时为我所用。文章来源地址https://www.toymoban.com/news/detail-824998.html

到了这里,关于3种策略巧妙化解PHP Trait成员属性冲突的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何巧妙调整 Docker 安装路径?高效策略揭秘

    🌟🌌 欢迎来到知识与创意的殿堂 — 远见阁小民的世界!🚀 🌟🧭 在这里,我们一起探索技术的奥秘,一起在知识的海洋中遨游。 🌟🧭 在这里,每个错误都是成长的阶梯,每条建议都是前进的动力。 🌟🧭 在这里,我们一起成长,一起进步,让我们在知识的世界里畅游

    2024年02月20日
    浏览(34)
  • 10、PHP语法要点3(foreach、trait)

    1、foreach 循环用于遍历数组,在vscode中输入foreach时默认的提示是这样的。 提示中除了给了$value之外,还给了$key值,key值一般在关联数组中自行定义的。但是普通数组中的key值是数组的索引,所以vscode这样提示也是没错的。 输出结果可以看出,key值输出的是索引值。  2、P

    2024年02月16日
    浏览(37)
  • 供应链|库存定位的高效策略:如何巧妙调换安全库存换取服务速度?

    论文作者:Hanzhang Qin, David Simchi-Levi, Ryan Ferer, Jonathan Mays, Ken Merriam, Megan Forrester, Alex Hamrick 论文解读者:马玺渊 王艺桦 本次解读的文章发表于 Production and Operations Management,原文信息:Hanzhang Qin, David Simchi-Levi, Ryan Ferer, Jonathan May, Ken Merriam, Megan Forrester, Alex Hamrick (2022) Trading sa

    2024年01月19日
    浏览(41)
  • Python 编程基础 | 第五章-类 | 5.2、属性成员

    属性成员是指类中定义的变量,即 属性 ,根据 定义位置 ,又可以分为 类属性 和 实例属性 ,下面分别进行介绍。 实例属性是指 定义在类的方法中 的属性,该属性属于当前实例,例如:定义一个Dog类,在该类的 __init__() 方法中定义2个实例属性,代码如下: 可以使用 . 来访

    2024年02月08日
    浏览(37)
  • 【C++】类和对象 - 封装 - 属性和行为,访问权限,class 和 struct区别,成员属性私有化

    No. Contents 1 【C++】基础知识 - HelloWorld,注释,变量,常量,,标识符 2 【C++】数据类型 - 整型,sizeof,实型,字符型,转义字符,字符串类型,布尔类型,数据的输入 3 【C++】运算符 - 算术运算符,赋值运算符,比较运算符,逻辑运算符 4 【C++】程序流程结构 - 循序结

    2024年02月07日
    浏览(47)
  • python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载

    上一篇提到过类的属性,但没有详细介绍,本篇详细介绍一下类的属性 一 、类的属性 方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个boss类,它的生命值就是属性(不同级别的boss,有不同的生命值),被攻击方法(不

    2024年02月08日
    浏览(39)
  • 【bug】记录一次使用Swiper插件时loop属性和slidersPerView属性冲突问题

    最近在vue3使用swiper时,突然发现loop属性和slides-per-view属性同时存在启用时,loop生效,下一步只能生效一次的bug,上一步却是好的。非常滴奇怪。 分析属性是否使用错误。 loop是循环模式,布尔型。 slides-per-view是同屏显示多少数量,数值型或’auto’。 更改的样式是否是诱因

    2024年02月14日
    浏览(55)
  • Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略

    本篇文章为总结View事件体系的第三篇文章,前两篇文章的在这里: Android进阶 View事件体系(一):概要介绍和实现View的滑动 Android进阶 View事件体系(二):从源码解析View的事件分发 本篇文章主要是介绍两种基本的滑动冲突情况和对应的解决策略,内容有: 基本的滑动冲突

    2024年02月10日
    浏览(37)
  • php时间选择器插件与安全过滤参数发生空格冲突

    php参数过滤时,将“ ”作为隐患予以禁止,但是在时间传递时,如 2023-09-30 10:00:00 作为变量传递时,被禁止。 在JavaScript中,你可以使用 String.prototype.replace() 函数来替换字符串中的特定字符。以下是一个封装的函数,将输入的时间字符串中的空格替换为’@\\\': 在这个函数中,

    2024年02月07日
    浏览(69)
  • Java安全——策略文件说明

    Java安全策略文件是Java中的一种安全设置,用于限制Java代码所能访问的资源和执行的操作。这些资源包括文件系统、网络和系统配置等。通过使用Java安全策略文件,可以提高Java应用程序的安全性,防止恶意代码的执行和数据泄露等问题。 Java安全策略文件通常以.policy结尾,

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包