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

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

ただいまの
回答率

88.57%

phpのクラスについて

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 503

ntttt

score 31

class User {
    // property
    public $name;

    // constructor
    public function __construct($name) {
      $this->name = $name;
    }

    // method
    public function sayHi() {
      echo "hi, i am $this->name!";
    }
  }

  $tom = new User("Tom");
  $bob = new User("Bob");
  $red = new User("red");
  $pink = new User("pink");
  $you = new User("you");
  $tim = new User("tim");

  $names = array($tom,$bob,$red,$pink,$you,$tim);

  foreach($names as $name){
    echo $name -> name();
  }

phpの値を配列にして、foreachで取り出す方法が分かりません。
色々と試行錯誤しましたが、ずっとエラーになるので、質問させていただきました。
ご回答いただければ幸いです。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2019/03/25 16:57

    (質問文は編集できます)質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

  • ntttt

    2019/03/25 17:07

    ご指摘ありがとうございました。
    今回は解決することができました。
    次回からはコードブロックに囲んで、質問したいと思います。
    ありがとうございました。

    キャンセル

回答 4

+3

<?php
class User {
    // property
    private $name; //privateにした

    // constructor
    public function __construct($name) {
    $this->name = $name;
    }

    public function getName() { //これを追加
        return $this->name;
    }
    // method
    public function sayHi() {
        echo "hi, i am $this->name!";
    }
}

$tom = new User("Tom");
$bob = new User("Bob");
$red = new User("red");
$pink = new User("pink");
$you = new User("you");
$tim = new User("tim");

$names = array($tom,$bob,$red,$pink,$you,$tim);

foreach($names as $name){
  echo $name->getName();
  echo PHP_EOL;
  $name->sayHi();
  echo PHP_EOL;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/25 16:58

    $nameをpublicのままでやるなら(やらないほうがいいが)、foreachの中は`$name->name;`とかっこなしにすればいい

    キャンセル

  • 2019/03/25 17:08

    ご回答ありがとうございます。
    解決いたしました。
    クラスの変数は基本的にpublicよりprivateの方が宜しいのでしょうか?

    キャンセル

  • 2019/03/25 17:19

    変数でも関数でも、基本的にはprivateで書いて、どうしても必要なものをpublicにするのが普通だと思います。
    例えば`$tom->name = "";`というのが、どこかでやられたら死にます(`$tom->getName() = "";`はエラーなのでそもそもできない)

    キャンセル

  • 2019/03/25 17:37

    かしこまりました。
    参考にさせて頂きます。
    質問とは別のこと質問に対してまで、ご回答いただきありがとうございました。

    キャンセル

checkベストアンサー

+2

foreach($names as $name){
     echo $name->name;
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/25 16:54

    ご回答ありがとうございます。
    実行してみましたが、エラーになります。

    キャンセル

  • 2019/03/25 17:00

    失礼しました。。回答を修正しました。

    キャンセル

  • 2019/03/25 17:05

    ありがとうございました。
    コードが実行されました。

    キャンセル

+1

なんのためにインスタンスを乱発しているのかわかりません
たとえばこんな感じで

class User {
  var $names=[];
  function setUser($name) {
    $this->names[] = $name;
  }
  function getUsers() {
    return $this->names;
  }
}
$myUser=new User();
$myUser->setUser("Tom");
$myUser->setUser("Bob");
$myUser->setUser("red");
$myUser->setUser("pink");
$myUser->setUser("you");
$myUser->setUser("tim");
$names = $myUser->getUsers();
foreach($names as $name){
  echo $name."<br>";
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/25 17:41

    ご回答ありがとうございます。
    progateでphpを勉強しているのですが、このような方法で値を取得していました。
    そのような書き方もあったのですね、参考になりました。

    キャンセル

+1

要件読み違えてるかもしれませんが、そもそも、オブジェクト内で配列でおさめれば良いのでは。

<?php
class User {
    private $names = [];
    public function set_names(string $name)
    {
        $this->names[] = $name;

    }
    public function get_names(int $index=null)
    {
        if(is_null($index)) return $this->names;
        return array_key_exists($index,$this->names)? $this->names[$index]:null; 
    }

    public function sayHi(int $index=null)
      $name = array_key_exists($index,$this->names)? $this->names[$index]:'No Name';
      echo "hi, i am {$this->names[$index]}!";
    }
  }
  $user = new User();
  $user->set_names('Tom');
  $user->set_names('Bob');
  $user->set_names('red');
  $user->set_names('pink');
  $user->set_names('you');
  $user->set_names('tim');

  $names = $user->get_names();
  foreach($names as $id=>$name){
    echo $name;
    echo PHP_EOL;
    echo $user->sayHi($id);
    echo PHP_EOL;
  }

/**
出力結果:
Tom
hi, i am Tom!
Bob
hi, i am Bob!
red
hi, i am red!
pink
hi, i am pink!
you
hi, i am you!
tim
hi, i am tim!
**/

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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