您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
php多继承解决方案trait
发布时间:2021-09-24 11:24:41编辑:雪饮阅读()
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。
一个简单的实例如下:
test.php:
<?php
trait Dog{
public $name="dog";
public function bark(){
echo "This is dog";
}
}
class Animal{
public function eat(){
echo "This is animal eat";
}
}
class Cat extends Animal{
use Dog;
public function drive(){
echo "This is cat drive";
}
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();
echo "<br/>";
$cat->bark();
?>
trait Dog{
public $name="dog";
public function bark(){
echo "This is dog";
}
}
class Animal{
public function eat(){
echo "This is animal eat";
}
}
class Cat extends Animal{
use Dog;
public function drive(){
echo "This is cat drive";
}
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();
echo "<br/>";
$cat->bark();
?>
运行结果:
C:\Users\Administrator\PhpstormProjects\untitled\organizing>D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe C:\Users\Administrator\PhpstormProjects\untitled\test.php
This is cat drive<br/>This is animal eat<br/>This is dog
这里Cat类本身是没有bark方法的,也没有eat方法的,但是Cat类可以通过继承Animal类得到eat方法,而由于单继承缘故,要想要再拿到Dog的bark方法,是不能通过继承实现,而是通过trait实现,trait不能被实例化,不能被继承,但是可以通过use关键字组合到当前类,所以最后这个Cat有了Animal的功能,也有了Dog类的功能。
像上面我有说过trait不能被实例化,那么假如我实例化:test.php:
<?php
trait Dog{
public $name="dog";
public function bark(){
echo "This is dog";
}
}
class Animal{
public function eat(){
echo "This is animal eat";
}
}
class Cat extends Animal{
use Dog;
public function drive(){
echo "This is cat drive";
}
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();
echo "<br/>";
$cat->bark();
$d=new Dog();
?> 其运行结果自然是抛出了异常: C:\Users\Administrator\PhpstormProjects\untitled\organizing>D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe C:\Users\Administrator\PhpstormProjects\untitled\test.php This is cat drive<br/>This is animal eat<br/>This is dog Fatal error: Uncaught Error: Cannot instantiate trait Dog in C:\Users\Administrator\PhpstormProjects\untitled\test.php on line 25 Error: Cannot instantiate trait Dog in C:\Users\Administrator\PhpstormProjects\untitled\test.php on line 25 Call Stack: 0.0002 397824 1. {main}() C:\Users\Administrator\PhpstormProjects\untitled\test.php:0
关键字词:php,trait