我想在一个类中重复使用的功能几次。 此功能依赖于私有变量:
trait Address {
private $address;
public function getAddress() {
return $this->address;
}
public function setAddress($address) {
$this->address = $address;
}
}
我发现的唯一方法使用性状的两倍 ,如下:
class User {
use Address {
getAddress as getHomeAddress;
setAddress as setHomeAddress;
getAddress as getWorkAddress;
setAddress as setWorkAddress;
}
}
问题是,这样做,私有变量$address
是在不同的方法共享,并如预期的代码将无法正常工作:
$user = new User();
$user->setHomeAddress('21 Jump Street');
echo $user->getWorkAddress(); // 21 Jump Street
有没有真正使用性状的两倍,而不能共享其私有变量的解决方案?
声明一个特征与use
不会产生该性状的一个实例。 性状基本上只是代码,复制并粘贴到使用类。 在as
将只创建一个别名为方法,例如,它会添加类似
public function getHomeAddress()
{
return $this->getAddress();
}
到User类。 但它仍然只能是一个特点。 不会有两个不同的$address
性质,但只有一个。
你可以做的方法私,然后通过委托任何公开呼吁它__call
通过在方法名开关/外壳和使用地址的阵列,例如
trait Address {
private $address = array();
private function getAddress($type) {
return $this->address[$type];
}
private function setAddress($type, $address) {
$this->address[$type] = $address;
}
public function __call($method, $args) {
switch ($method) {
case 'setHomeAddress':
return $this->setAddress('home', $args[0]);
// more cases …
}
}
}
但是,这仅仅是忌讳的。
换句话说,你不能做三立你正在尝试与特点做。 无论是使用两种不同的特质。 或者使用好老聚集,并添加具体的代理方法。
我可能是党的有点晚了,但你要创建的行为是不是应该由一个特质被覆盖,但通过简单的对象组合。
<?php
class Adddress {
private $street;
private $number;
public function __construct(string $street, ?string $number) {}
public function street() : string {}
public function number() : string {}
}
class User {
private $homeAddress;
private $workAddress;
public function getHomeAddress() : Address {}
public function setHomeAddress(Address $homeAddress) : self {}
public function getWorkAddress() : Address {}
public function setWorkAddress(Address $workAddress) : self {}
}
我确认,你可以多次,这是一个让我吃惊别名相同的功能。 虽然ZendStudio似乎只有“代码辅助”功能上的最后一个别名。
能够别名相同功能的多次能借给自己一些有趣的行为,如果性状功能可以判断什么名字,它被称为是。 但它不会出现我们能确定的特征函数中的“别名”功能。
这里是我的测试代码:
<?php
trait TestTrait
{
public function test() { print __CLASS__ . ', ' . __TRAIT__ . ', ' . __METHOD__ . ', ' . __FUNCTION__ . "\n"; }
}
class TestClass
{
use TestTrait { test as test1; test as test2; }
}
$c = new TestClass();
$c->test1();
$c->test2();
输出:
TestClass, TestTrait, TestTrait::test, test
TestClass, TestTrait, TestTrait::test, test
也许这将是很好的添加新的别名常数性状的功能,以确定哪些别名他们被称为。
事实上,我已经创造了这个PHP功能要求:
https://bugs.php.net/bug.php?id=63629