的字面解釋下列給出的實施細則會是這樣的
class Ball
{
protected static $balls = array();
protected $cssRule;
public function __construct($cssRule)
{
self::$balls[] = $this;
$this->cssRule = $cssRule;
}
public static function getCss()
{
$css = '';
foreach (self::$balls as $ball) {
$css .= $ball->getCssRule();
}
return $css;
}
public function getCssRule()
{
return $this->cssRule;
}
}
換句話說,你可以收集創建的實例的靜態屬性。然後,您可以按照您的問題要求做什麼,例如(demo)
new Ball('foo');
new Ball('bar');
new Ball('baz');
echo Ball::getCSS();
然後打印foobarbaz。這是否是一個好方法是一個不同的問題。我更喜歡另一種方法是這樣的:
class Balls implements IteratorAggregate
{
protected $balls;
public function __construct()
{
$this->balls = new SplObjectStorage;
}
public function attach(Ball $ball)
{
$this->balls->attach($ball);
}
public function detach(Ball $ball)
{
$this->balls->detach($ball);
}
public function getIterator()
{
return clone($this->balls);
}
public function create($cssRule)
{
$ball = new Ball($cssRule);
$this->attach($ball);
return $ball;
}
}
然後,您可以做
$balls = new Balls;
$balls->create('foo');
$balls->create('bar');
$balls->create('baz');
創造新Ball
情況下,它會自動地存儲在Balls
。並且因爲Balls
是IteratorAggregate
,所以您可以簡單地迭代foreach
的所有實例,例如,
$css = '';
foreach($balls as $ball) {
$css .= $ball->getCssRule();
}
echo $css;
當然,您也可以將該代碼移動到Balls
的實例方法中。
我很難理解你想要做什麼。請澄清問題。也許刪除所有的實現細節,只是說明你的設置/場景以及你想要的輸出/目標是什麼。 – Gordon 2012-02-16 20:41:53
似乎與[這個問題](http://stackoverflow.com/questions/475569/get-all-instances-of-a-class-in-php) – parkker007 2012-02-16 20:55:45
好找parkker007,我錯過了那一個。 – 2012-02-19 01:07:30