欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP-trait-笔记

程序员文章站 2024-02-19 15:01:46
...

trait

trait是一种代码复用的方法,用于模拟实现多继承(PHP是单继承语言)

注意:

1.trait中的写法和普通的类写法一样(不过一般我们只写方法)

2.如果trait中的属性与类中的属性同名,则会报告错误

3.trait无法被new实例化

4.trait可以嵌套trait

源代码:

<?php
	trait A
	{
		function go()
		{
			echo "Go<br />";
		}
	}

	trait B
	{
		use A;//嵌套trai A
		function ao()
		{
			echo "Ao<br />";
		}
	}

	class C
	{
		use B;//复用trait B的代码
	}

	$p = new C();
	$p->go();//调用复用的代码
	$p->ao();
?>

显示:

Go
Ao

 

 

解决方法同名问题:

关键字:insteadof 代替(instead of)            as 别名

源代码:

<?php
	trait A
	{
		function go()
		{
			echo "去那<br />";
		}
	}

	trait B
	{
		function go()
		{
			echo "走呀<br />";//方法名与trait A中的重复
		}
	}

	class C
	{
		use A,B
		{
			A::go insteadof B;//trait A中的go()代替trait B中的go()
			B::go as goB;//将trait B中的go取个别名为goB
		}
		
	}

	$p = new C();
	$p->go();//调用的trait A中的go()方法
	$p->goB();//调用取别名的trait B的go()方法
?>

显示:

去那
走呀

 

 

关于优先级问题:

子类是先继承父类,再使用trait复用代码,所以当继承和trait同时使用的时候父类的成员方法与trait方法同名时会被trait方法重写,但是我们可以通过parent解决这个问题

源代码:

<?php
	class A
	{
		function Ton()
		{
			echo "你";
		}
	}

	trait B
	{
		function Ton()//该方法于class A中的Ton()方法同名
		{
			parent::Ton();//我们可以通过调用原来的方法来解决重写问题
			echo "好";
		}
	}

	class C extends A
	{
		use B;
	}

	$p = new C();
	$p->Ton();
?>

显示:

你好

 

相关标签: PHP 笔记