Php 简明教程
PHP – Traits
在 PHP 中,一个类只能从一个父类继承,多重继承在 PHP 中没有定义。PHP 中的 Traits 被引入来克服此限制。你可以在一个 Trait 中定义一个或多个方法,它们可以自由地重复用于各种独立的类。
Syntax
"trait" 关键字按以下语法使用 −
trait mytrait {
function method1() {
/*function body*/
}
function method2() {
/*function body*/
}
}
为了能够调用 Trait 中的方法,需要使用 use 关键字将其提供给另一个类。
Example
Trait 类似于一个类,但只用于以细粒度和一致的方式对功能进行分组。无法单独实例化 Trait。
<?php
trait mytrait {
public function hello() {
echo "Hello World from " . __TRAIT__ . "";
}
}
class myclass {
use mytrait;
}
$obj = new myclass();
$obj->hello();
?>
它将生成以下 output −
Hello World from mytrait
Example
一个 Trait 可以用在多个类中。以下示例有一个带有 avg() 函数 int 的 mytrait。它在 marks 类中使用。percent() 方法在内部从 Trait 调用 avg() 函数。
请看以下示例:
<?php
trait mytrait {
function avg($x, $y) {
return ($x+$y)/2;
}
}
class marks {
use mytrait;
private int $m1, $m2;
function __construct($x, $y) {
$this->m1 = $x;
$this->m2 = $y;
}
function percent():float {
return $this->avg($this->m1, $this->m2);
}
}
$obj = new marks(50, 60);
echo "percentage: " . $obj->percent();
?>
它将生成以下 output −
percentage: 55
Using Multiple Traits
一个类可以使用多个 Trait。这里我们有两个 Trait,每个 Trait 都带有一个函数,分别对两个数字进行加法和乘法。两者都在第三个类中使用。
<?php
trait addition {
function add($x, $y) {
return $x+$y;
}
}
trait multiplication {
function multiply($x, $y) {
return $x*$y;
}
}
class numbers {
use addition, multiplication;
private int $m1, $m2;
function __construct($x, $y) {
$this->m1 = $x;
$this->m2 = $y;
}
function calculate():array {
$arr = [$this->add($this->m1, $this->m2), $this->multiply($this->m1, $this->m2)];
return $arr;
}
}
$obj = new numbers(50, 60);
$res = $obj->calculate();
echo "Addition: " . $res[0] . PHP_EOL;
echo "Multiplication: " . $res[1] . PHP_EOL;
?>
它将生成以下 output −
Addition: 110
Multiplication: 3000
Overriding Trait Function
当一个类使用某个 Trait 时,其函数对它可用,就像子类继承父类方法一样。Trait 函数也可以被覆盖。
<?php
trait mytrait {
public function sayHello() {
echo 'Hello World!';
}
}
class myclass {
use mytrait;
public function sayHello() {
echo 'Hello PHP!';
}
}
$o = new myclass();
$o->sayHello();
?>
它将生成以下 output −
Hello PHP!
The "insteadof" Keyword
有时,两个以上的 Trait 可能会具有相同名称的函数。因此,在类中使用它们会导致模棱两可的情况。PHP 提供 insteadof 关键字来告知解析器你要使用哪个 Trait 函数。
<?php
trait mytrait {
public function sayHello() {
echo 'Hello World!';
}
}
trait newtrait {
public function sayHello() {
echo 'Hello PHP!';
}
}
class myclass {
use mytrait, newtrait{
newtrait::sayHello insteadof mytrait;
}
}
$o = new myclass();
$o->sayHello();
?>
它将生成以下 output −
Hello PHP!
Aliasing a Trait Function
如果你希望能够从这两个 Trait 中调用函数,即使它们具有同名的函数,解决方法是为其中一个指定别名。
Example
在以下示例中,我们将 mytrait 中的 sayHello() 称为 hello() −
<?php
trait mytrait {
public function sayHello() {
echo 'Hello World!' . PHP_EOL;
}
}
trait newtrait {
public function sayHello() {
echo 'Hello PHP!' . PHP_EOL;
}
}
class myclass {
use mytrait, newtrait{
mytrait::sayHello as hello;
newtrait::sayHello insteadof mytrait;
}
}
$o = new myclass();
$o->hello();
$o->sayHello();
?>
它将生成以下 output −
Hello World!
Hello PHP!