为什么Traits不能直接实例化?

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有什么好处呢?它与抽象类有什么不同?请帮助我理解使用方法.谢谢.

Gin*_*ane 8

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)