在 PHP 中,我可以为 class 属性 添加别名吗?例如。通过 Trait 允许 ArrayAccess 方法

In PHP, can I alias a class property? E.g. to allow ArrayAccess methods via Trait

我在我的一些 class 中实现了 ArrayAccess,而且我经常在我的 class 中使用与 [=23= 中几乎完全相同的 ArrayAccess 方法代码].

由于代码是一样的,如果把这个写成Trait一次就好了,然后我的classes就可以implement ArrayAccess(和现在一样),use ArrayAccessTrait 无需复制一堆 ArrayAccess 方法。

唯一阻止这种情况的是我通常不希望我的底层数组命名为 $container,而是其他与我正在构建的 class 更相关的东西。

所以我的问题是,有没有办法“别名”我在自己的 class 中使用的任何数组 属性 名称,而 $container 在我的 ArrayAccessTrait ?

下面的例子有一个 Foo class 显示了我想要的;此示例有效,但我希望能够在 Foo class.

中使用 属性 以外的名称 $container
trait ArrayAccessTrait {
  private $container = [];

  public function offsetSet($offset, $value) {
    if (is_null($offset)) {
      $this->container[] = $value;
    } else {
      $this->container[$offset] = $value;
    }
  }

  public function offsetExists($offset) {
    return isset($this->container[$offset]);
  }

  public function offsetUnset($offset) {
    unset($this->container[$offset]);
  }

  public function offsetGet($offset) {
    return isset($this->container[$offset]) ? $this->container[$offset] : null;
  }
}                                                                                                                                                                                                                                             

class Foo implements ArrayAccess {
  use ArrayAccessTrait;

  private $container = [];

  public function __construct() {
    $this->container = [
      "one" => 1,
      "two" => 2,
      "three" => 3,
    ];
  }

  public function hello($msg = 'Hello World') {
    echo $msg . "<br/>\n";
  }
} 

$obj = new Foo;
$obj->hello();
echo "Array accessing element ['two'] = " . $obj['two'];

如果您在特性中定义私有属性,则可以说您不应该在实现它的 classes 中直接引用它们。相反,只需使用特征中的方法。即,而不是在具体 class:

中执行此操作
$this->container["one"] = 1;

这样做:

$this["one"] = 1;

那么你不需要知道存储属性叫什么,也不需要围绕它写任何代码。setting/getting另请注意,您不需要在 class 中重新定义 private $container = [];,因为它已经带有特征。