gpt4 book ai didi

php - PHP 的特征——任何现实世界的例子/最佳实践?

转载 作者:IT老高 更新时间:2023-10-28 11:43:52 26 4
gpt4 key购买 nike

Traits一直是 PHP 5.4 的最大补充之一。我知道语法并理解特征背后的想法,例如日志、安全、缓存等常见内容的横向代码重用。

但是,我仍然不知道如何在我的项目中使用特征。

是否有任何已经使用特征的开源项目?关于如何使用特征构建架构的任何好的文章/阅读 Material ?

最佳答案

我想人们现在必须研究具有特征的语言一段时间才能学习公认的良好/最佳实践。我目前对 Trait 的看法是,您应该只将它们用于必须在其他具有相同功能的类中复制的代码。

Logger 特征示例:

interface Logger
{
public function log($message, $level);
}

class DemoLogger implements Logger
{
public function log($message, $level)
{
echo "Logged message: $message with level $level", PHP_EOL;
}
}

trait Loggable // implements Logger
{
protected $logger;
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
public function log($message, $level)
{
$this->logger->log($message, $level);
}
}

class Foo implements Logger
{
use Loggable;
}

然后你做(demo)

$foo = new Foo;
$foo->setLogger(new DemoLogger);
$foo->log('It works', 1);

我想在使用特征时要考虑的重要一点是,它们实际上只是被复制到类中的代码片段。这很容易导致冲突,例如,当您尝试更改方法的可见性时,例如

trait T {
protected function foo() {}
}
class A {
public function foo() {}
}
class B extends A
{
use T;
}

以上将导致错误(demo)。同样,在 trait 中声明的任何方法也已在 using 类中声明,也不会被复制到该类中,例如

trait T {
public function foo() {
return 1;
}
}
class A {
use T;
public function foo() {
return 2;
}
}

$a = new A;
echo $a->foo();

将打印 2 ( demo )。这些是您要避免的事情,因为它们使错误难以发现。您还需要避免将事物放入对使用它的类的属性或方法进行操作的特征中,例如

class A
{
use T;
protected $prop = 1;
protected function getProp() {
return $this->prop;
}
}

trait T
{
public function foo()
{
return $this->getProp();
}
}

$a = new A;
echo $a->foo();

工作(demo),但现在 trait 与 A 紧密耦合,水平重用的整个想法都丢失了。

当您关注 Interface Segregation Principle您将拥有许多小类和接口(interface)。这使得 Traits 成为您提到的事物的理想候选者,例如crosscutting concerns ,但不是组合对象(在结构意义上)。在我们上面的 Logger 示例中,特征是完全隔离的。它不依赖于具体的类。

我们可以使用 aggregation/composition (如本页其他地方所示)来实现相同的结果类,但使用聚合/组合的缺点是我们必须手动将代理/委托(delegate)方法添加到每个应该能够记录的类中。 Traits 很好地解决了这个问题,它允许我将样板保存在一个地方并在需要的地方选择性地应用它。

注意:鉴于特征是 PHP 中的一个新概念,上述所有观点可能会发生变化。我自己还没有太多时间来评估这个概念。但我希望它足以让你思考。

关于php - PHP 的特征——任何现实世界的例子/最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892749/

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