批改状态:未批改
老师批语:
PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法。php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。
<?php
trait Drive{
public $carName = 'trait';
public function driving(){
echo "driving {$this->carName}";
}
}
class Person{
public function eat(){
echo "eat\n";
}
}
class Student extends Person{
use Drive;
public function study(){
echo "study\n";
}
}
$student = new Student();
$student->study();
$student->eat();
$student->driving();点击 "运行实例" 按钮查看在线实例
输出结果如下:
study
eat
driving trait
上面的例子中,Student类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。
如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?
<?php
trait Drive {
public function hello() {
echo "hello drive\n";
}
public function driving() {
echo "driving from drive\n";
}
}
class Person {
public function hello() {
echo "hello person\n";
}
public function driving() {
echo "driving from person\n";
}
}
class Student extends Person {
use Drive;
public function hello() {
echo "hello student\n";
}
}
$student = new Student();
$student->hello();
$student->driving();点击 "运行实例" 按钮查看在线实例
输出结果如下:
hello student
driving from drive
因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号