2011-07-07 12 views
1

私は、2つの異なるデータオブジェクトにアクセスするPHPスクリプトを作成しています.1つはDBで、もう1つはセッションデータです。それらは両方とも同じフィールドを含みます。つまり、セッションオブジェクト内のデータは、一度検証されるとDBに入ります。名前を知らずにオブジェクトプロパティにアクセスしていますか?

私は、dbバックアップされたオブジェクトの値を最初にチェックし、次にセッションデータをバックアップしたオブジェクトで値をチェックする関数を記述しようとしています。しかし、私が期待しているのと同じように動作しません。ここに私が持っているものがあります。

<?php 
    function check_cache($field){ 
      // $App is the DB backed object, $data is the session object 
     return $app->$field ? $app->$field : $data->$field ? $data->$field : ''; 
    } 
?> 

私はこのような機能を呼び出すことができるようにしたい:

<input type="text" value="<?php echo check_cache('address'); ?>" /> 

...しかし、関数は常に何も返しません。私が望むフィールド名に$fieldを代入して、実際のインラインコードで関数呼び出しを置き換えると、動作します。私は何が欠けていますか?

答えて

1

$ appと$ dataが関数のスコープ内に存在することを確認してください(パラメータとして渡すことで、私はあなたに任せます)。これを試してみてください:

<?php 
    function check_cache($field){ 
      // $App is the DB backed object, $data is the session object 
     return $app->${$field} ? $app->${$field} : $data->${$field} ? $data->${$field} : ''; 
    } 
?> 

あなたはおそらく$アプリを確保するために、このかかわらを拡張する必要があります - > $$フィールドが存在している、など

編集:

指摘したように、これは、かなり間違っていますコメントのボブ・ザ・ビルダーによる$app->$fieldが必要です。スコープが正しいことを確認し、必要なメンバーはプライベートではありません。謝罪。

+1

注意をこれが意味することを '$$自身がどのような値' $ field'であるため、関数のスコープ内に存在している必要がありますfield'。 – BoltClock

+0

+1。 –

+1

@Jack Murdoch:つまり、あなたは '$ app - > $ {$ field}'ではなく、 '$ app - > $ field'を必要とします。可変変数の場合 –

0

私はそれがスコープの問題だと言いたいのですが、$ app + $ dataは関数内には存在せず、外側にしか存在しません。 2つの余分なパラメータを取るように関数を拡張し、$ app + $ dataオブジェクトをそのように渡します。それは性質がプライベートでだ場合、これは全く問題は修正されません

補遺は、あなたはまだ、自分のクラスの構造に応じて、オブジェクトのフィールドにアクセスする必要があります、いくつかのを行いますobj-> field構文でフィールドにアクセスすることはできないため、代替回答は機能しません。

0

あなたはこのような何かを試すことができます。

<?php 
    function check_cache($field){ 
     global $app, $data; 
     // $App is the DB backed object, $data is the session object 
     $av = eval("\$app->".$field); 
     $dv = eval("\$data->".$field); 
     return $av ? $av : $dv ? $dv : ''; 
    } 
?> 
関連する問題