質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

phpのオブジェクト

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 858

score 12

  <?php
  $object = new User;
  print_r($object); echo "<br/>";
//=>User Object ([name] => [password=>])

  $object -> name = "Joe";
  $object -> password ="mypass";
  print_r($object); echo "<br/>";
//=>User Object ([name] => Joe [password=> mypass])

  $object -> save_user();
//=>Save User code goes here

  class User
  {
    public $name,$password;
    function save_user()
    {
      echo "Save User code goes here";
    }
  }
  ?>
なぜ一回目と二回目のprint_r($object); echo "<br/>";は出力する値が異なるのでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

身近な例で例えると、
User クラスは空の冷蔵庫みたいなもので、print_r()は冷蔵庫の中身を表示する関数です。

$object = new User;
は「冷蔵庫を買ってくる」ようなイメージで(クラスをインスタンス化してオブジェクトを生成する)
その直後にprint_r()をしても冷蔵庫の中身はありません。

  $object -> name = "Joe";
  $object -> password ="mypass";
では冷蔵庫の1段目にJoeを2段目にmypassを入れました。
そのため、この後にprint_rすると中身であるところのJoeとmypassが見えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/28 11:46

    うーん、何かクラスとオブジェクトの関係について誤解があるように思います。

    > 8.9行目までいかないとオブジェクトが何かわかりませんよね?
    「オブジェクトが何か」というのが何を挿しているのかよく分かりませんが、
    2行目で
    $object = new User;
    としているので、Userクラスのオブジェクトだという事が分かります。

    Userクラスでは
    デフォルト値の無いプロパティが
    public $name,$password;
    と定義されています。
    これは
    インスタンス化されたタイミングではそれぞれのプロパティ
    nameとpasswordにそれぞれ値が設定され無い状態で
    オブジェクトに格納されることを示します。
    *プロパティはあるが、値が空ということです。

    3行目のprint_r()ではその状態を表示するため、
    プロパティそのものは見えるが、値は見えない(正確には値が設定されていないことが表示される)
    となります。

    キャンセル

  • 2015/12/07 14:48

    例えば冷蔵庫や冷凍庫等の収納があってそれに食材が入ってるとして
    いきなりどんな収納に何が入ってるか?と言われてもわかりませんよね?
    ------------------------------------------------------------------------------
    最初のprint_r()より後の8,9行目
    > $object -> name = "Joe";
    > $object -> password ="mypass";
    です。
    -------------------------------------------------------------------------------
    とおっしゃったように、冷凍庫(name)に魚(Joe)、冷蔵庫(password)に野菜(mypass)があると分かって収納と食材の存在が明確になりますよね?
    なのにそれが提示される前になんで冷凍庫(name)や冷蔵庫(mypass)等の収納(プロパティ名)が分かるのでしょうか?

    キャンセル

  • 2015/12/07 15:14 編集

    ああ、やっと疑問としている点が理解出来ました。
    > なのにそれが提示される前になんで冷凍庫(name)や冷蔵庫(mypass)等の収納(プロパティ名)が分かるのでしょうか?
    「この冷蔵庫にはnameとpasswordのみ収納でき、それぞれの収納スペースにはその収納するものの種類を書いておく。冷蔵庫を作成した時点ではそれぞれの収納スペースは空の状態にしておく」
    >public $name,$password;
    と設計された冷蔵庫だからです。

    newする(設計図から実物を作る)時点で冷蔵庫の棚に[name][password]と収納するものが記載されている状態で実物が作られるので、print_r(冷蔵庫の扉を開ける)すると、その[name][password]のそれぞれ収納スペースがあることと、そこに何も入っていないことが分かります。

    キャンセル

0

print_r($object); はUserのインスタンスである$objectを表示します。1回目はUserの属性$name, $passwordが設定されていません。一方、2回目のprint_r($object); の前には
 $object -> name = "Joe";
  $object -> password ="mypass";
という文があり、ここで、$name, $passwordを設定しています。そのため、2回目のprint_r($object);ではこれらの値が表示されることになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/28 07:53

    name 、password と "Joe" "mypass"は同じところで定義されていますよね?
    なのに一回目の出力がプロパティしか出力されないのはなぜですか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る