Ami*_*Ray 1 php class traits abstract php-5.4
在测试PHP中的特征时,我有点困惑为什么要引入特征.我做了一些小实验.首先,我直接在一个类中调用trait方法
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHellos() {
$o = new HelloWorld();
$o->sayHello();
}
}
$o = new TheWorldIsNotEnough();
$o->sayHellos();
?>
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误
Fatal error: Cannot instantiate trait HelloWorld in C:\xampp\htdocs\test.php on line 35
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class MyHelloWorld {
use HelloWorld;
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHellos() {
$o = new MyHelloWorld();
$o->sayHello();
}
}
$o = new TheWorldIsNotEnough();
$o->sayHellos();
?>
Run Code Online (Sandbox Code Playgroud)
我能够调用特征方法,结果显示为"Hello World!".那么使用Traits有什么好处呢?它与抽象类有什么不同?请帮助我理解使用方法.谢谢.
Traits不要实例化.它们只是代码部分,您可以use通过它们在类中重用它们.您可以想象,trait代码会扩展并成为您班级的一部分.甚至伤心,那:
特征本质上是语言辅助的复制和粘贴.
所以你的例子应该这样工作:
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHellos() {
// your trait defines this method, so now you can
// think that this method is defined in your class directly
$this->sayHello();
}
}
$o = new TheWorldIsNotEnough();
$o->sayHellos();
//or simply
$o->sayHello();
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3321 次 |
| 最近记录: |