php教程,如何使用trait功能,抽象提取类的公有方法?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
trait
被称之为php
的核心特性,从最经典的php@5.4
开始就增加的新特性。然而,现在都php@8
的时代了,这个trait
特性却依然很少有人使用。那么,php
的trait
究竟是怎么使用的呢?
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
。
trait
是什么
苏南大叔的理解着:trait
就是抽象自class
的类,把其中的公共方法的代码都提取出来,放到一个trait
中。可以理解为一个全是函数(类方法)的代码片段。是对class
类定义的一个补充方式。
在使用场景上,其实把定义在trait
中的方法函数,定义在父类里面,效果也是一样的,而且会更加好理解一些。这可能就是trait
实际的使用场景很少的原因吧。
定义并使用trait
下面的代码演示了trait
的最基本的使用方式,里面出现了use
关键字。这里的use
不是函数,没有()
,直接跟上trait
的名字即可。
trait N {
public function test() {
echo 'trait,public,苏南大叔',PHP_EOL;
}
}
class S {
use N;
}
$b = new S();
$b->test();
也可以定义多个trait
,使用方式基本类似。
trait N {
public function test() {
echo 'trait,public,苏南大叔',PHP_EOL;
}
}
trait N2 {
public function test2() {
echo 'trait2,public,苏南大叔',PHP_EOL;
}
}
class S {
use N,N2;
}
$b = new S();
$b->test();
$b->test2();
关于trait
的用法,基本上到这里就结束了。后面的都是特例了,trait
自身就很罕见,后面的用法更罕见。
特例一:多个trait
存在同名方法
如果引入的多个trait
存在着相同名称的方法,那么就会存在着歧义代码冲突。例如:
trait N {
public function test() {
echo 'trait,public,苏南大叔',PHP_EOL;
}
}
trait N2 {
public function test() {
echo 'trait2,public,苏南大叔',PHP_EOL;
}
}
class S {
use N,N2;
}
$b = new S();
$b->test();
报错如下:
Fatal error: Trait method N2::test has not been applied as S::test, because of collision with N::test
解决方案如下:
trait N {
public function test() {
echo 'trait,public,苏南大叔',PHP_EOL;
}
}
trait N2 {
public function test() {
echo 'trait2,public,苏南大叔',PHP_EOL;
}
}
class S {
use N,N2 {
N2::test insteadof N; // 选择两个trait中的同名方法
}
}
$b = new S();
$b->test();
关键代码:
use N,N2 {
N2::test insteadof N; // 选择两个trait中的同名方法
}
特例二:类主体有trait
中的同名方法
主体类中引入trait
后,发现自身存在着和trait
里面同名的方法:
trait N {
public function test() {
echo 'trait,public,苏南大叔',PHP_EOL;
}
}
trait N2 {
public function test() {
echo 'trait2,public,苏南大叔',PHP_EOL;
}
}
class S {
use N,N2 {
N2::test insteadof N; // 选择两个trait中的同名方法
}
public function test(){
echo '类主体自带的同名方法',PHP_EOL;
}
}
$b = new S();
$b->test(); // 类主体自带的同名方法
这种情况下,并不报错,相当于存在了一个方法覆盖的关系。类主体的方法覆盖trait
里面的同名方法。
支持public/private/static
trait N {
public function test() {
echo 'trait,public,苏南大叔',PHP_EOL;
}
private function test2() {
echo 'trait,private,uncle sunan',PHP_EOL;
}
public static function test3() {
echo 'trait,static,sunan大叔',PHP_EOL;
}
}
class S {
use N;
public function test2(){
echo '类主体覆盖同名方法的private属性',PHP_EOL;
$this::test3();
}
}
$b = new S();
$b->test2();
可以看到,这个代码中,本来在trait
中定义的私有方法,在类主体中,被覆盖成了公开方法。
相关文章
结束语
trait
虽然不常见,但是也是作为php
的核心特性而存在的。更多php
的经验文章,请参考苏南大叔的博客文章:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。