2012-04-26 17 views
0

このクラスはエコーを返すように変更しても私に空白の出力を与えますが、問題の内容はわかりませんが、明らかにクラスとオブジェクトを扱うのに精通していません。私のクラスは最初の値だけを返すのはなぜですか?

私は変数/配列を間違って処理していますが、人が作成された場合にのみ返されるべきであるため、変数がClassの下で宣言されるべきではないことがあります。 $argsで処理する必要があるため、関数内で変数を宣言するか、まったく宣言しないでください。

更新された質問: FIRSTNAMEだけでなく、すべての引数を返すにはどうすればよいですか?

PHP:

class people_handler 
{ 
    public $firstname; 
    public $middlename; 
    public $lastname; 
    public $city; 
    public $province_state; 
    /* zip+4 is default for postcode (postal code) */ 
    public $postcode; 
    public $country; 

    function create_people($args) 
    { 
     $fullname=array($this->firstname,$this->middlename,$this->lastname); 
     $normname=array($this->firstname,$this->lastname); 
     $fulladdress=array($this->city,$this->province_state,$this->postcode,$this->country); 
     if(!$args->middlename&&$args->firstname && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country) 
     { 
      $temp_arr=array($normname,$fulladdress); 
      foreach($temp_arr as $value) 
      { 
       foreach($value as $values) 
       { 
        return $values; 
       } 
      } 
     } 
     else if($args->firstname && $args->middlename && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country) 
     { 
      $temp_arr=array($fullname,$fulladdress); 
      foreach($temp_arr as $value) 
      { 
       foreach($value as $values) 
       { 
        return $values; 
       } 
      } 
     } 
     else 
     { 
      die ("Must enter all values excluding middlename."); 
     } 
    } 
} 

$p1=new people_handler; 
$p1->firstname="John"; 
$p1->middlename="Jonah"; 
$p1->lastname="Jameson"; 
$p1->city="Lansing"; 
$p1->province_state="Michigan"; 
$p1->postcode="48876-4444"; 
$p1->country="USA"; 


echo $p1->create_people($p1); 

戻り値:

John 
+0

これは違いがないようです。 –

+0

@mgraph:それは問題ではありません... –

答えて

3

オブジェクトの自己参照が不足している:すべての場所の上に$this

クラス内のメソッドまたはプロパティを参照する場合は、いつでも$ thisをプロセスを実行しているオブジェクトの現在のインスタンスとして参照する必要があります。あなたはすでにこれらのプロパティに値を割り当てられているのでので、例えば...

$fullname=array($firstname,$middlename,$lastname); 

は、動作するはず

$fullname=array($this->firstname,$this->middlename,$this->lastname); 

になります。

EDIT:さらにコードを見ると、ループを介して常に値を返すことは、ブラウザにエコーすることを管理しません。 を返す代わりに、または値から配列を作成して返し、スクリプトが配列を処理してブラウザにエコーさせるようにすることができます。

編集:すべての値を取得するには、ビルド時にそれらを収集する必要があります。もう1つの選択肢は、メソッドの一部としてブラウザに出力することです。どちらのオプションも機能しますが、それらを配列に集めれば移植性が向上しますが、保守するコードもかなり少なくなります。また、メソッドを動作させるためにオブジェクトを渡す必要はありません。

echo $p1->create_people($p1); 

であるべき... create_people

$p1->create_people(); 

はあなたが持っているよ...動作するはず
function create_people() 
{ 
    $fullname=array($this->firstname,$this->middlename,$this->lastname); 
    $normname=array($this->firstname,$this->lastname); 
    $fulladdress=array($this->city, $this->province_state, $this->postcode, $this->country); 
    if($args->firstname && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country) 
    { //Don't bother including middlename if it doesn't matter if it is filled or not... 
     $temp_arr = array($normname, $fulladdress); 
     foreach($temp_arr as $value) 
     { 
      foreach($value as $values) 
      { 
       echo $values; 
      } 
     } 
    } else { 
     die ("Must enter all values excluding middlename."); 
    } 
} 

。ライン14における

+0

それはその一部を修正するようですが、現在はすべての情報ではなく、最初のもののみを表示します。 –

+0

コードを更新すると、サンプルを更新することはできますか? – Malovich

+0

更新されました。 –

1

$fullname=array($firstname,$middlename,$lastname); 

おそらくすべきである:

$fullname=array($this->firstname,$this->middlename,$this->lastname); 

同一行16:

$fulladdress=array($city,$province_state,$postcode,$country); 
+0

あなたは正しいです! – Malovich

2

別に自己参照問題から(BTW $argsでありますこれは自己参照でなければなりません)、あなたのループ構造は間違っています。

$temp_arr=array($normname,$fulladdress); 
foreach($temp_arr as $value) 
{ 
    foreach($value as $values) 
    { 
     return $values; 
    } 
} 

この意志:それを通じてtemp_arrて

  1. ループ、最初の値として$のnormnameを見つける
  2. トリートの$ normname配列とループなど
  3. 戻ることがで見つかった最初の値$ normname
  4. これで、関数は終わり、他はすべて実行されません。

機能は、戻り値を持つことができます。複数の情報を返す必要がある場合は、配列またはオブジェクトとして返す必要があり、すべてが1つの要素にまとめられます。

あなたのクラスで何を達成しようとしているのかまだ分かりませんので、残念ながらあなたのやりたいことを手伝うことはできません。

編集:この場合は何も返す必要はありません。あなたのクラスでは、クラス内のすべての関数がこれらの変数にアクセスできるようになります。 「新規」では、オブジェクトのインスタンスを作成します。つまり、「a people_handler」を作成します。このpeople_handlerはプロパティを公開していますので、クラス外から設定することができます(大きなプロジェクトではうまくいかないかもしれませんが、これは問題ありません)。すべてのクラスの一部である機能(それはそれの内側に、である)、これらのプロパティは、現在、自己参照を使用して、その特定のpeople_handlerを持っている値がどのようにアクセスすることができ、$this

class TestClass { 
    public fullname; //a random "property" 
    function echoFullname() { 
     echo $this->fullname; //whatever fullname is at the moment for the TestClass object we are using 
    } 
} 

$a = new TestClass(); //Create a TestClass object 
$a->fullname = "Alex"; //make its name "Alex" 

$b = new TestClass(); //Create another TestClass object 
$b->fullname = "Carl"; //but let's name him Carl 

$a->echoFullname(); //And now output the names 
$b->echoFullname(); 

明らかにこれは実用的な用途を持っていませんうまくいけばそれがどのように機能するかを示してくれるはずです。あなたが見ることができるように、可変渡しは全く必要ではありません。

+0

情報がクラス内の他の関数に渡されるため、関数に入力するすべての値を返したいと思います。私はデバッグ目的でエコーしようとしています。 –

+0

私のリターンループは、私の他の関数への各値を正しく返すだろうか? –

+0

入力したすべてのデータが返されるようにするには、2通りの方法があります。あなたはすべてのデータの*配列*を返すことができ、次にechoの代わりに 'var_dump()'を返します。または、すべてのデータを含む*文字列*を返すことができます。前者の場合、 'foreach'を削除して' return $ temp_arr; 'を実行します。後者の場合、結果の文字列を '$ result_line。= $ values;のようなループに入れてください。 /*...*/ return $ result_line; ' – Armatus