PHP基础补全系列:Trait

本文通过实战案例介绍了PHP中的Traits特性。Traits用于增强类而无需继承,尤其在多继承受到限制的情况下非常有用。文章详细解释了Traits如何与类方法共存及解决方法冲突的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个系列的文章是用来学习PHP的一些语法特性,用来加强自己对PHP的理解。在大多数情况下都是作为自己的学习笔记,文章内容不会超出PHP手册,所以想了解相关特性的可以直接去看PHP手册。

PHP手册链接

PHP 5.4加入了trait。

个人理解为trait在PHP中变相实现了多继承。但是我还不是很理解它的使用场景。

<?php

trait TraitClass {
	function say () {
		echo "trait say<br/>";
	}

	function walk () {
		echo "trait walk<br/>";
	}
}

class Father {
	function say () {
		echo "father say<br/>";
	}
}

class Son extends Father {
	use traitClass;

	function walk () {
		echo "son walk<br/>";
	}
}

/**
 * trait、基类和当前类同名方法优先级
 * 当前类>trait>基类
 */
$son = new Son();
//todo trait方法与基类方法同名的情况下,trait的方法优先于基类的方法
$son->say();//输出结果:trait say
//todo 当前类的方法同名时,当前类方法优先于trait的方法
$son->walk();//输出结果:son walk

trait Trait1 {
	function say () {
		echo "Trait1 say<br/>";
	}

	function walk () {
		echo "Trait2 walk<br/>";
	}

	function run () {
		echo "Trait1 run<br/>";
	}
}

trait Trait2 {
	function say () {
		echo "Trait2 say<br/>";
	}

	function walk () {
		echo "Trait2 walk<br/>";
	}
}

trait Trait3 {
	function say () {
		echo "Trait3 say<br/>";
	}

	function walk () {
		echo "Trait3 walk<br/>";
	}
}

class Son1 {
	use Trait1, Trait2, Trait3 {
		Trait1::say insteadof Trait2, Trait3;
		Trait2::walk insteadof Trait1, Trait3;
		Trait1::run as trait1Run;
	}
}

/**
 * 当有多个trait方法重名的时候,可以使用instendof方法排除不用的选项。个人觉得这个地方比较奇怪,不是指定而是排除,需要将那些不使用的trait一一列举出来
 * 使用别名的方式不能解决冲突问题,因为使用别名之后,两种调用方式都会保留
 */
$son1 = new Son1();
//todo 当有多个trait方法重名的时候,需要将那些不使用的trait一一排除
$son1->say();//输出结果:Trait1 say
$son1->walk();//输出结果:Trait2 walk
//todo 使用别名的方式不能解决冲突问题,因为使用别名之后,两种调用方式都会保留
$son1->run();//输出结果:Trait1 run
$son1->trait1Run();//输出结果:Trait1 run


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值