php – 如何使变量私有的特征?

前端之家收集整理的这篇文章主要介绍了php – 如何使变量私有的特征?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在一个类中多次重用一个功能.此功能依赖于一个私有变量:
  1. trait Address {
  2. private $address;
  3.  
  4. public function getAddress() {
  5. return $this->address;
  6. }
  7.  
  8. public function setAddress($address) {
  9. $this->address = $address;
  10. }
  11. }

我发现到use the trait twice的唯一方法是:

  1. class User {
  2. use Address {
  3. getAddress as getHomeAddress;
  4. setAddress as setHomeAddress;
  5.  
  6. getAddress as getWorkAddress;
  7. setAddress as setWorkAddress;
  8. }
  9. }

问题是,通过这样做,私有变量$address在不同的方法之间共享,代码将无法正常工作:

  1. $user = new User();
  2. $user->setHomeAddress('21 Jump Street');
  3. echo $user->getWorkAddress(); // 21 Jump Street

有没有解决方案真正使用trait两次,而不共享其私有变量?

声明使用trait将不会创建该trait的实例.特征基本上只是复制并粘贴到使用类中的代码.这将仅为该方法创建一个别名,例如它会添加类似的东西
  1. public function getHomeAddress()
  2. {
  3. return $this->getAddress();
  4. }

到你的用户类.但这仍然只是一个特点.不会有两个不同的$address属性,只有一个.

您可以使这些方法是私有的,然后通过__call通过switch / shell委托方法名称上的任何公共调用,并使用地址的数组,例如.

  1. trait Address {
  2. private $address = array();
  3.  
  4. private function getAddress($type) {
  5. return $this->address[$type];
  6. }
  7.  
  8. private function setAddress($type,$address) {
  9. $this->address[$type] = $address;
  10. }
  11.  
  12. public function __call($method,$args) {
  13. switch ($method) {
  14. case 'setHomeAddress':
  15. return $this->setAddress('home',$args[0]);
  16. // more cases …
  17. }
  18. }
  19. }

但这只是一个蠕虫病毒.

换句话说,你不能真正地做你想要做的特质.使用两种不同的特征.或使用好的旧聚合并添加具体的代理方法.

猜你在找的PHP相关文章