2011-02-10 4 views
2

私は$ o-> a-> b、あるいはおそらく$ 0-> c ['d']を得ることができるPHP $ oにオブジェクトがあるとします。は、プログラムでPHPのオブジェクトのプロパティの 'アドレス'を格納する方法はありますか?

他の場所で処理するためのアドレスの種類としてこれらを保存する方法はありますか?

私が持っていることは、オブジェクトのさまざまなプロパティを処理する必要があるいくつかの異なる場所で同じ方法であるということです。

私がやりたいことは、私が行っている通りにアドレスの集合を構築し、それらを全てすべてを通して処理する単一の関数に渡すことです。

例:

$ o-> a = 'red';

$ o-> b-> c = 'red';

$ o-> [[e '] =' red ';

...「赤色」を「緑色」に変更したいのですが、状況によっては特定のキーやプロパティーが変わることがあります。

答えて

2

あなたはこれを行うことができます。

$propertyName = 'a'; 
$o->$propertyName = 'green'; 

ではなく、この:

$propertyName = 'b->c'; 
$o->$propertyName = 'green'; 

を別の方法として、あなたはこのように、変数への参照を作成することができます。Manual: Variable variablesパー

$a[] = & $o->a; 
$a[] = & $o->b->c; 
$a[] = & $o->d['e']; 

foreach ($a as $key => $color) { 
    $a[$key] = 'green'; 
} 
+0

これは完璧です。参考文献のリストは私の必要なものです。ありがとう:) – joachim

+0

また、追加されたボーナス - 私はオブジェクトにそのリストを保存するので、$ o-> reflistのように、すべてのものがシリアル化されて生き残るように見えます! – joachim

1

<?php 
class foo { 
    var $bar = 'I am bar.'; 
} 

$foo = new foo(); 

$f = 'foo'; 
$b = 'bar'; 
echo $$f->$b; 

だから、プロパティ名とチェーンを作ることができる:任意のオブジェクトの

<?php 
class CB { var $c = 'whee'; } 
class CO { var $b; } 
$o = new CO(); 
$o->b = new CB(); 

// normal access 
echo $o->b->c; 

// variable access 
$chain = array('o', 'b', 'c'); // for $o->b->c 
$obj = ${ array_shift($chain) }; 

while (sizeof($chain) > 1) { 
    $obj = $obj->{ array_shift($chain) }; 
} 

echo $obj->{ $chain[0] }; 
0

少しアドバイス...

パブリック・プロパティはあなたの問題のすべての方法を引き起こす可能性があります。今まであなたがやっていることは本当に必要なことかもしれませんが、私はあなたのクラスでgetterとsetterを使用し、これらのプロパティを別の場所で呼び出すことをお勧めします。

次に、変更可能な内容とその変更方法を制御します。

+0

警告ありがとう - これらはノードのようなDrupalオブジェクトなので、stdClassだけです。 – joachim

+0

ゲッターとセッターは[同様に悪いアプローチです](http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html)することができます。更新をカスケードする方法を知っているオブジェクト( '$ o')にメソッド(' storeStuff')を持たせるのが良いです(様々な変数を '' green''に設定する) – Rudu

+0

@Rudu:私のポイントは、いつでもカスケードすることができます - 私がこのルーチンに来るたびに、私は$ oで全く異なる構造を持つかもしれません。 – joachim

関連する問題