在 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 = [];
,因为它已经带有特征。
我在我的一些 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 = [];
,因为它已经带有特征。