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

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

新規登録して質問してみよう
ただいま回答率
86.02%
PHP

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

Q&A

解決済

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

kantowebmanager
kantowebmanager

総合スコア29

PHP

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

3回答

0グッド

2クリップ

25093閲覧

投稿2018/04/24 12:06

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

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

退会済みユーザー

退会済みユーザー

2018/04/24 12:09 編集

だいぶ違うのだな。

回答3

10

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

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

php

1<?php 2class example { 3 public function test_b() { // (1)はクラス内のメソッド 4 ... 5 } 6 ... 7} 8 9function test_b() { // (2)はクラス実装の外側にある 10 ... 11}

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

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


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

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

php

1<?php 2 3$var = 'global value'; 4class SimpleClass 5{ 6 // プロパティの宣言 7 public $var = 'property value'; 8 9 // メソッドの宣言 10 public function displayVar() { 11 $var = 'local value'; 12 echo $this->var . PHP_EOL; // 'property value'を出力 13 echo $var . PHP_EOL; // 'local value'を出力 14 echo $GLOBALS['var'] . PHP_EOL; // 'global value'を出力 15 } 16} 17 18$test = new SimpleClass; 19$test->displayVar();

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

投稿2018/04/24 12:14

編集2018/04/25 01:34
退会済みユーザー

退会済みユーザー

総合スコア0

Andrew_Haru, E90, kei344, m.ts10806, asahina1979, kantowebmanager, imprezza, omaru, s_tatsuki👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

kantowebmanager

2018/04/24 13:26

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

2018/04/25 00:27

クラスの設定してますよね?
退会済みユーザー

退会済みユーザー

2018/04/25 01:51 編集

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

2018/05/03 02:24

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

2018/05/03 02:24

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

2

ベストアンサー

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

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

PHP

1<?php 2 3 class clshoge{ 4 public $group ; //変数group (1) 5 6 public function test_b(){ 7 $group ; //変数group (2) 8 9 $this->group = "value class" ; 10 11 $group = "value test_b" ; 12 13 return $group ; 14 } 15 16 } 17 18 ini_set('display_errors', 1); 19 20 //PHPローカル変数group 21 $group = "value PHP" ; //変数group (3) 22 23 //インスタンス生成 24 $hoge = new clshoge ; 25 26 //結果表示 27 28 echo $group . "<BR>" ; //変数group (1) 29 30 //プロパティgroupの取得→まだ値がセットされていない 31 echo $hoge->group . "<BR>" ; //変数group (2) 32 33 //test_bメソッド実行(戻り値:test_b内のgroup) 34 //プロパティgroupにも値をセットしている 35 echo $hoge->test_b() . "<BR>" ; //変数group (3) 36 37 //プロパティgroupの取得 38 echo $hoge->group . "<BR>" ; //変数group (2) 39 40?>

結果:
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/25 00:20

imprezza

総合スコア61

kantowebmanager👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

kantowebmanager

2018/04/25 21:11

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

2018/04/25 23: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:クラスのプロパティ(手続き型的な表現ではグローバル変数) パッと見似た記載方法ですが、片や関数、片や変数なのです
kantowebmanager

2018/04/28 23: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」だけが当てはまるということなのでしょうか。
imprezza

2018/04/30 23: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 |呼び出せない| どうでしょうか
kantowebmanager

2018/05/03 01: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マニュアルを一通り熟読し、色々と動かしてみると良いです。

PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ](http://www.atmarkit.co.jp/ait/articles/1506/03/news019.html)

投稿2018/04/24 20:59

編集2018/04/24 21:02
m.ts10806

総合スコア80030

kei344, kantowebmanager👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

kantowebmanager

2018/04/25 21:27

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

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

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

PHP

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