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

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

ただいまの
回答率

90.76%

  • PHP

    19192questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPのthisと->の意味がわかりません。

解決済

回答 3

投稿

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

以下のソースコードがあります。

switch($t = $this->list->test_a($this->test['groupid']))
        {// ページ種別の判定
            case '-1':
                $this->group = $this->test_b();
                break;
            case '0':/
                $this->group = $this->test_c();
                break;
        }

thisは何をさしているのでしょうか。

それと、例えば上記の$this->group = $this->test_b();の意味なのですが、「$thisは連想配列で、その$thisの中にgroupというキーがあって、そのキーに値として$this->test_b()という関数がreturnで返す結果を格納している」という考え方であっているでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2018/04/24 21:09 編集

    だいぶ違うのだな。

    キャンセル

回答 3

+7

PHP: クラスの基礎 - Manual
$thisはインスタンス自身のことを、クラス(のプロパティやメソッドなど)の実装をするときに自分自身を指すために使います。
もしも$this->grpupでなく単に$groupとした場合は、ローカル変数でしかないため、
メソッドを抜けると保持されなくなります。

->は左側に示すインスタンスが所有するメンバーを、右側に示すプロパティやメソッドや定数でアクセスするものです。
もしもtest_b()とすると、(名前空間内の)test_b()関数を呼び出す意味になってしまい、
例えば

<?php
class example {
  public function test_b() {  // (1)はクラス内のメソッド
    ...
  }
  ...
}

function test_b() {  // (2)はクラス実装の外側にある
  ...
}


といった意地悪なケースで1と2のどっちを呼ぶのかを迷惑に分ける必要があるため、
$this->test_b()test_b()と書き方が別れます。

$this->group = $this->test_b();は、
自インスタンスの変数もしくはプロパティであるgroupに対して、
自インスタンスのメソッドであるtest_b()の結果を代入する、
と解釈できると思います。


あちこちの入門書などに既に丁寧な説明がなされていることを書くのは少々はばかられますが、
乗りかかった船なので続けて補足します。

phpの公式ドキュメントの、PHP: クラスとオブジェクト
一通り目を通してサンプルコードを動かしてみてくれると
理解が早いと思いますが、

<?php

$var = 'global value';
class SimpleClass
{
    // プロパティの宣言
    public $var = 'property value';

    // メソッドの宣言
    public function displayVar() {
        $var = 'local value';
        echo $this->var . PHP_EOL;  // 'property value'を出力
        echo $var . PHP_EOL;  // 'local value'を出力
        echo $GLOBALS['var'] . PHP_EOL;  // 'global value'を出力
    }
}

$test = new SimpleClass;
$test->displayVar();


ひっかけ問題のように小難しくしてみましたが、
どこで宣言されているものを参照するかを明確にするために、
$thisや->があります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/24 22:26

    ご回答ありがとうございます。
    「自インスタンス」とは私の書いたソースコードの場合、どこを指しているのでしょうか。
    上記のswitch文はPHPファイルの一部でして、switch文は実際には「function testfunc」というfunctionの中で使われているのですが、この場合testfuncメソッド?が自インスタンス=$thisということでしょうか。
    それとなのですが、「$this->grpup」のgroupはプロパティやメソッドとのことですが、$マークが外れているので、gropuは連想配列のキーだと予測したのですが違うのでしょうか。

    キャンセル

  • 2018/04/25 09:27

    クラスの設定してますよね?

    キャンセル

  • 2018/04/25 10:45 編集

    ソースコードの全体を見せてもらわないと正しく説明しづらいです。
    function testfunc()の実装において$thisを使っているということは、function testfunc()が何かのクラスに属するメソッドとして実装されているからではないでしょうか。
    もっとソースコードをさかのぼっていけば、class宣言が見つかるはずです。
    もしもclass宣言がないのだとすると、他のphpソースファイルからrequire <http://php.net/manual/ja/function.require.php> にて読み込まれている可能性もあるのでファイルから検索してください。

    キャンセル

  • 2018/05/03 11:24

    失礼しました。
    ソースコードがあまりに大量に書かれていてだいぶ省いてしまいました。
    クラス宣言、よく探したら見つかりました。
    このたびはありがとうございました。

    キャンセル

  • 2018/05/03 11:24

    あと連想配列全く関係なかったんですね。

    キャンセル

checkベストアンサー

+2

サンプルコピペから始めて少し前にそこにつまづいたのでアドバイスになれば

thisや->が使われるのはclass内でメソッドやプロパティを利用している時です

<?php

  class clshoge{
    public $group ;    //変数group (1)

    public function test_b(){
      $group ;   //変数group (2)

      $this->group = "value class" ;

      $group = "value test_b" ;

      return $group ;
    }

  }

  ini_set('display_errors', 1);

  //PHPローカル変数group
  $group = "value PHP" ;   //変数group (3)

  //インスタンス生成
  $hoge = new clshoge ;

  //結果表示

  echo $group . "<BR>" ;           //変数group (1)

  //プロパティgroupの取得→まだ値がセットされていない
  echo $hoge->group . "<BR>" ;     //変数group (2)

  //test_bメソッド実行(戻り値:test_b内のgroup)
  //プロパティgroupにも値をセットしている
  echo $hoge->test_b() . "<BR>" ;  //変数group (3)

  //プロパティgroupの取得
  echo $hoge->group . "<BR>" ;     //変数group (2)

?>

結果:
value PHP
(空白)
value test_b
value class

意地悪く一つのクラス周辺に3つのgroupを用意しましたが、それぞれ別物として扱います。
その際に関係してくるのが
・クラス(インスタンス)hogeを指すthis
・クラス内で持っているプロパティとメソッドを指す->

PHP上でクラス内プロパティgroupを指したいときは
$hoge->group (インスタンスに->)

PHP上でクラス内メソッドtest_bを指したいときは
$hoge->test_b (インスタンスに->)

メソッドtest_b内でクラス内プロパティgroupを指したいときは
$this->group (クラスの中なのでthisと表現)

長々と書きましたがどうでしょうか?thisと->の使い方、理解の一助になりましたか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/26 06:11

    コメントくださりありがとうございます。
    だいぶわかってきたのですが、少し理解できなかったところがあるのですが、「echo $hoge->group」なのですが、このときに「$group = "value test_b" ;」ではなく、「$this->group = "value class" ;」の部分が呼ばれるのはどうしてでしょうか。

    キャンセル

  • 2018/04/26 08:29

    おはようございます
    必要以上にややこしくしていますね
    私の作ったメソッド test_bでは二つの事をしています
    (1)classのプロパティ $group に"value class"をセットする
    (2)classメソッド test_bのローカル変数 $group に"value test_b"をセットして戻り値として返す
    なので、インスタンスを生成して$hoge->test_bを実行すると、(2)の"value test_b"が返ってきます。
    そして$hoge->groupはclassプロパティ(クラスで宣言している変数)を参照するので(1)の"value class"がセットされています
    (test_bを実行する前に$hoge->groupを参照すると空っぽです)
    ・$hoge->test_b:メソッドの実行結果(手続き型的な表現では関数の戻り値)
    ・$hoge->group:クラスのプロパティ(手続き型的な表現ではグローバル変数)
    パッと見似た記載方法ですが、片や関数、片や変数なのです

    キャンセル

  • 2018/04/29 08:24

    遅くなってすみません。
    自分なりに整理してみたのですが、「$hoge->group」と書いたときには最初「clshogeクラスの中で定義された$group」という意味だと思ったので、test_bの中で定義されている「$group ; //変数group (2)、$this->group = "value class" ;、$group = "value test_b" ;」の3つ全てが当てはまると思いましたが、そうではなくて「$hoge->group」と書いたら「clshogeクラスの中で”$this->group”のようにthisを使って定義されている$group」だけが当てはまるということなのでしょうか。

    キャンセル

  • 2018/05/01 08:25

    おはようございます
    連休はさんだのでこちらも確認と返答遅くなりました
    $hoge->groupが指すものは、public $group ; //変数group (1)です(PHP本文から)
    同じpublic $group ; //変数group (1)を、メソッドtest_b()から参照したい場合は$this->$groupと呼び出します。
    本文から参照するか、クラス内のメソッドから参照するかで書き方が違います。
    変数(1)~(3)を本文、メソッド内それぞれから呼び出す書き方を一覧にすると分かり易くなりますかね
    |呼び出し元|変数1|変数2|変数3|
    |:--|:--:|:--:|--:|
    |本文 |$hoge->group|呼び出せない(戻り値を受け取るのみ)|$group |
    |test_b|$this->group|$group |呼び出せない|
    どうでしょうか

    キャンセル

  • 2018/05/03 10:26

    やっとわかりました。
    詳しくご説明くださり誠にありがとうございました。

    キャンセル

+2

thisは何をさしているのでしょうか。 

今提示されているコードの中にはありません。
通常は、Class(オブジェクト)自身を指します。

コードの解説を求めるのであれば、なるべくコード全体を提示しましょう。

それと、例えば上記の$this->group = $this->test_b();の意味なのですが、「$thisは連想配列で、その$thisの中にgroupというキーがあって、そのキーに値として$this->test_b()という関数がreturnで返す結果を格納している」という考え方であっているでしょうか。 

いいえ、違います。コードが全て提示されないと確実なことは言えませんが、
$thisはtest_b()関数や$groupというプロパティを持っているクラスで、$groupというプロパティでtest_b()関数の結果を受け取って保管している
ということは言えます。

ただしそのクラスが何かしらのクラスを継承している場合、
$groupやtest_b()関数がprivateに設定していなければ、そのクラス自身ではなく親クラス側に持っている可能性もあるので、やはりコード全体が必要です。

->については既に出ている通りですね。

PHPマニュアルを一通り熟読し、色々と動かしてみると良いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/26 06:27

    ありがとうございます。
    PHPマニュアル、読んでみたいと思います。

    キャンセル

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

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

関連した質問

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

  • PHP

    19192questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。