当前位置: 首页 > 知识库问答 >
问题:

PHP特性公共和单独(单独)属性范围

周滨海
2023-03-14

在traits内部定义的方法可以访问同一对象中定义的方法一样的公共属性范围,这是很有用的。然而,有没有任何方法可以使两个特征使用相同的属性名称,但每个属性都在不同的范围内,因此setTwo()不会覆盖$this-

示例:

<?php

namespace one;

trait one {

    public function setOne($data) {
        $this->data = $data;
    }

    public function getOne()
    {
        return $this->data;
    }
}

namespace two;

trait two {

    public function setTwo($data) {
        $this->data = $data;
    }

    public function getTwo()
    {
        return $this->data;
    }
}

namespace bar;

class Bar {
    use \one\one;
    use \two\two;
}

$bar = new Bar;

$bar->setOne(1);
$bar->setTwo(2);

echo "Bar getOne: " . $bar->getOne() . '<br>' . PHP_EOL; // echoes 2 instead of wanted 1
echo "Bar getTwo: " . $bar->getTwo() . '<br>' . PHP_EOL; // overwrites $this->data = 1 with 2
echo "Bar->data: " . $bar->data . '<br>' .  PHP_EOL;

我之所以要寻找单独的作用域,是因为对于常见属性的名称,例如:sum、result、cache,在组成一个包含许多特性的类时,您可能会在某个时候无意中覆盖它们。

我唯一想到的是使用由特征组成的中间类(它有自己的命名空间和自己的范围),并将其作为依赖项传递给其他类,这些类需要用于中间组合的特征的某些功能。在上面的例子中,我需要两个中介类 - 一个具有特征一,另一个具有特征二。

除了中间类或改变每个特性之外,还有其他选项吗<code>$this-


共有1个答案

夏侯昊明
2023-03-14
匿名用户

每个特征都应该定义其方法所需的属性。

依赖未定义的属性或在使用特征进行组合的类上定义的属性是一个坏主意。因此,拥有多个依赖于相同属性的特征也是一个坏主意。

每一个特质都应该提供它所需要的一切,逻辑上的。

此外,特征没有“范围”。当使用特征时,就好像特征中的代码被复制到消费类。在您的示例中,< code>setOne()和< code>getTwo()的作用域是< code>Bar的一个实例,这些方法在traits中定义是不相关的。

更明智的方法是在特质本身中包含你的特质需要的任何属性:

例如。:

 trait CanLog {

    private LoggerInterface $logger;

    public function error(string $data)
    {
        $this->logger->error($data);
    }

    public function alert(string $data)
    {
        $this->logger->error($data);
    }
}

通过这种方式,消费类简单地从特征中导入它需要的行为,完成,并且可以在特征提供的属性中注入它们需要的任何内容:

class Bar
{
    use CanLog;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger; 
    }
}

 类似资料:
  • 问题内容: 我提供了带有几个命令和子命令的命令行工具,我使用了cobra命令行,并且我有两个 单独的命令 ,第一个是其他 命令的 先决条件 例如,第一个命令是通过创建临时文件夹并验证某些文件来选择环境 第二个命令应该从第一个命令获得一些属性 用户应该像这样执行它 btr准备 btr运行 当执行时,它应该从命令结果中获取一些数据 更新 好吧,下面的答案并没有真正的帮助。我需要在 本地和云环境中的 两

  • 1.id <text id="top">Top</text> id是weex标签(即控件)在template下的唯一标识符,可以通过id来引用对应的weex标签。 var top=this.$el('top')//通过this.el('id')找到标签 dom.scrollToElement(top)//滚动到指定的标签 2.style style="width:200;height:20

  • 我是为了一个电子商务系统而向Lucene提出的,需要索引产品及其属性。然而,我不确定如何处理这个问题,因为每个产品都有一个完全唯一的属性列表。 大多数在线示例显示lucene访问层具有产品结构,如名称/标题/描述,有时甚至带有只为每个产品添加的自定义域。

  • 这是我的输入,我有一个数组,其中名称键在多个对象中具有值“Foo1”,因此我希望在单独的数组中相对于“name”键值和其他信息的唯一对象。 下面的数组是唯一的名称键和其他值和状态键从所有匹配的对象存储在new_obj键。

  • 22.13.4.通过系统属性执行单独测试 如上所述该机制已经被测试过滤取代 译者注:被取代的东西就先不翻译了 Setting a system property of taskName.single = testNamePattern will only execute tests that match the specified testNamePattern. The taskName can