gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:23:37 24 4
gpt4 key购买 nike

在 PHP 中测试 traits 时,我对为什么要引入 traits 感到有点困惑。我做了一些小实验。首先我在一个类中直接调用了 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();

?>

我遇到了一个错误

Fatal error: Cannot instantiate trait HelloWorld in C:\xampp\htdocs\test.php on line 35

但是当我这样做的时候

<?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();

?>

我能够调用 trait 方法,结果显示“Hello World!”。那么使用 Traits 有什么优势,它与抽象类有何不同?请帮助我了解用法。谢谢。

最佳答案

Traits不应该被实例化。它们只是代码部分,您可以通过 use 在您的类中重用它们。您可以想象,trait 代码扩展并成为您的类的一部分。甚至令人难过的是:

Traits are essentially language assisted copy and paste.

所以你的例子应该像这样工作:

<?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();
?>

关于php - 为什么Traits不能直接实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com