2017-07-15 46 views
3

下面是該問題的簡化版本。根據其他對象值的總和自動更新PHP對象值

class A{ 
public $value = 0; 
} 
class B{ 
    public $values; 
    public $total = 0; 
    function __construct($values) { 
     foreach($values as $value){ 
      $this->values[] = &$value; 
      $this->total += $value->value; 
     } 
    } 
} 

$a = new A; 
$a->value = 10; 
$b = new A; 
$b->value = 20; 
$x = new B(array($a, $b)); 
echo $x->total . "\r\n"; 
$b->value = 40; 
echo $x->total; 

的輸出是:

30 
30 

我想總要被自動更新到50,而不重複所述陣列上並且重新計算的總和。是否有可能使用PHP指針? 所需輸出:

30 
50 
+0

您有興趣的解決方案,可以做類中的任何neccessary,還是必須使用指針? – colburton

+0

任何可以完成這項工作的解決方案。不特定於類。只需要這個用於優化算法 –

+0

*「是否有可能使用PHP指針?」 - PHP不提供指針。無論您瞭解PHP指針,請放下該源代碼;這是壞的。 – axiac

回答

1

如果有起源變化,總和不能改變。這些信息丟失了。但是,您可以使用魔術__set方法將其他邏輯添加到普通設置。在那裏你可以打電話給「計算器」來改變總數。

如果你不需要保留以前的界面,你應該使用一個真正的設置值(setValue)來實現這一點,因爲__set是不好的做法。

例如:

class A 
{ 
    private $value = 0; 
    private $b; 

    public function setObserver(B $b) 
    { 
     $this->b = $b; 
    } 

    public function __get($name) 
    { 
     if ($name == 'value') { 
      return $this->value; 
     } 
    } 

    public function __set($name, $value) 
    { 
     if ($name == 'value') { 
      $prev  = $this->value; 
      $this->value = $value; 

      if ($this->b instanceof B) { 
       $this->b->change($prev, $this->value); 
      } 
     } 
    } 
} 

class B 
{ 
    public $total = 0; 

    public function __construct($values) 
    { 
     foreach ($values as $v) { 
      if ($v instanceof A) { 
       $this->total += $v->value; 
       $v->setObserver($this); 
      } 
     } 
    } 

    public function change($prevValue, $newValue) 
    { 
     $this->total -= $prevValue; 
     $this->total += $newValue; 
    } 
} 

打印:

30 
50 
+0

但是,如果我調用這個函數,那麼它每次都會在數組上迭代,這實際上會破壞問題的目的。我不想多次迭代這些值。基本上尋找一個優化 –

+0

@Abdul:現在呢? – colburton

+0

雖然它工作正常,但用於優化的角度。它以某種方式爲我執行相同的。無論如何,感謝您的幫助。 –