2011-08-08 25 views
1

このクラスのmain関数は、reusableFunctionを異なるデータで2回使用し、そのデータを別のインスタンス変数($ this-> result1containerおよび$ this-> result2container)に送信しようとします。どちらの場合でも、データはインスタンス変数に入りません。クラスパラメータを関数パラメータに渡す方法

私はreusableFunctionをarray_push($ this-> result1container、$ resultdata)とarray_push($ this-> result2container、$ resultdata)の2つの異なる関数にすることで動作させることができました。私がコードを複製する必要のない解決策を見つけようとしています。

私の解決策は、結果コンテナの名前を関数に渡そうとしましたが、行ってはいけませんでした。誰かがこれを働かせる方法を知っていますか?

コード例:

Class Example { 

    private $result1container = array(); 
    private $result2container = array(); 

    function __construct() { 
     ; 
    } 

    function main($data1, $data2) { 
     $this->reusableFunction($data1, $this->result1container); 
     $this->reusableFunction($data2, $this->result2container); 
    } 

    function reusableFunction($data, $resultcontainer) { 
     $resultdata = $data + 17; 

     // PROBLEM HERE - $resultcontainer is apparently not equal to 
     // $this->result1container or $this->result2container when I 
     // try to pass them in through the parameter. 

     array_push($resultcontainer, $resultdata); 
    } 

    function getResults() { 
     return array(
      "Container 1" => $this->result1container, 
      "Container 2" => $this->result2container); 
    } 

} 

(これは質問の重複している場合は、私は謝罪し、誰かが親切にそこに私を指すようになります場合は喜んでその質問から答えを学びます私の研究は、「didnの。 tはどんな答えを上げ、しかし、あなたがなりたいように、私は右の質問は、それは私には見えます

答えて

4

)を検索することが知らなかったので、これはただのかもしれませんpassing by reference

function reusableFunction($data, &$resultcontainer) { 
    ... 

&で参照渡しをしない場合は、変数のローカルコピーをreuseableFunctionにしているだけです。

+0

まあ私は気が気になりません。私は数時間にわたって様々なソリューションをテストしました。私は最初から一人のキャラクターでした。ありがとうポール。 – Turenne

+0

@Turenne:この回答を受け入れてください:[回答を受け入れる:どのように動作しますか?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235 #5235) - 助けてくれてありがとう! – hakre

+0

@Hakre:15分待って、MaSchがリファレンスの使用をアドバイスしている理由を理解しようとしています。 – Turenne

1

元のコピーではなくコピーを変更しています。 by referenceDocsArray別名:

function reusableFunction($data, &$resultcontainer) { 
#        ^

そして、その仕事を行う必要があります。代わりに、変更されたを返し、それが属しているオブジェクトメンバに割り当てます(再利用可能性については、の場合実際の機能は単にプッシュのみを行います)。

さらに

array_push($resultcontainer, $resultdata); 

$resultcontainer[] = $resultdata; 

のように記述することができる。しかし、それは本当にFYIです。

0

あなたはこのようなメソッドに文字列としての属性名を渡すことがあります。

function reusableFunction($data, $resultcontainer) { 
    $resultdata = $data + 17; 
    array_push($this->{$resultcontainer}, $resultdata); 
} 

//..somewhere else.. 
    $this->reusableFunction($data, 'result2Container') 

いくつかのPHPの専門家は、「なぜあなたはPHPでBYREFERENCEを使用しないでください」に関するいくつかの文章を書きました。

もう1つの解決策は、コンテナを配列として定義することです。次に、結果を配列に格納するために使用されるメソッドに「キー」を渡すことができます。このように:

private $results = array(); 

function reusableFunction($data, $resIdx) { 
    $resultdata = $data + 17; 
    array_push($this->$results[$resIdx], $resultdata); 
} 

//..somewhere else.. 
    $this->reusableFunction($data, 'result2Container'); 
//..or pass a number as index.. 
    $this->reusableFunction($data, 1); 
+0

HERESにブログの投稿フォームヨハネスSchlüter(PHP 5.3のリリースマネージャ)へのリンク:「PHPの参照を使用しないでください」 http://schlueters.de/blog/archives/125-Do-not-use-PHP-references .html – masch

+0

あなたが提供するリンクは確かに読みやすいですが、あまり一般化しないでください:* "これまでのまとめ: - OOのリファレンスは使用せず、PHP 4の遺産を取得してください。 。これは一般的なことではありませんが、あなたは何をしているのかを知っているヨハネスが与えるリマインダです。確かに参照が何であるかの手掛かりがない場合は、それらを使用しないでください。 – hakre

+0

私はPHPで参照(&)を使用する理由は実際には分かりませんが、それに対して本当に良い理由がいくつかあります。彼らなしではすべてが良いです! – masch

関連する問題