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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

4回答

166閲覧

$thisはなぜ使われている?

dog57

総合スコア131

PHP

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2019/03/24 05:21

PHPでオブジェクト指向を学んでいる際に、ふと疑問に感じました。

$this->はなぜ使われているのでしょうか?

// 車クラス class Cars { // プロパティー public $colors = '赤'; // 走るメソッド public function run() { $this->colors = '緑'; echo "走る"; } }

上記の

$this->colors = '緑';

は、下記のコードでは表すことはできないのですか?

$colors = '緑';

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/24 10:17

phpマニュアルで 学んでるんですよね?
guest

回答4

0

phpの$thisは省略できません

以下追記

php

1<?php 2 3class Cars1 4{ 5 // プロパティー 6 public $colors = '赤'; 7 8 // 走るメソッド 9 public function run() 10 { 11 $this->colors = '緑'; 12 echo "走る"; 13 } 14} 15 16class Cars2 17{ 18 // プロパティー 19 public $colors = '赤'; 20 21 // 走るメソッド 22 public function run() 23 { 24 $colors = '緑'; 25 echo "走る"; 26 } 27} 28 29$car1 = new Cars1(); 30$car1->run(); 31echo "Car1: " . $car1->colors . "\n"; 32 33$car2 = new Cars2(); 34$car2->run(); 35echo "Car2: " . $car2->colors . "\n"; 36 37?>

実行結果

$ php car.php 走るCar1: 緑 走るCar2: 赤

投稿2019/03/24 05:24

編集2019/03/24 12:31
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dog57

2019/03/24 05:26

ご回答ありがとうございます! 省略できない理由はなんでしょうか?
moonphase

2019/03/24 05:29

今出先で確認できませんが、thisを省略するとメソッドのローカル変数になるので、プロパティは変化しないはずです。
dog57

2019/03/24 05:56

$thisはグローバル変数になるってこですか?
moonphase

2019/03/24 06:00

$thisは擬似変数で、クラスインスタンスのメンバにアクセスするために必要です。 $thisがないと、メソッドローカル変数の未定義の$colorsへ代入し、$thisがあると、クラスメンバの$colorsへ代入します。
moonphase

2019/03/24 12:38

サンプルコードを回答に追記しました。 Cars1はクラスメンバ変数への代入を行っているので、色が緑に変わっています。 Cars2ではrunメソッドのローカル変数へ代入を行っているので、色は赤のまま変化しません。
guest

0

質問の意図を、なぜ「$this->」を省略できないのか、自明ではないのか、わかりきったことを書くのは無駄ではないのか、という意味で理解しています。

回答として、PHPの構文上省略できません。

例えば、c#だとthis.Color = "緑";などと書くと、VisualStudioがthis.を暗い色にし、ヒントで消すように指示してきます。確かに自明で無駄だと思います。なぜなら、ローカルにColorを作るにはvar Color = "緑";とかかなければならず、インスタンス変数か関数内ローカル変数か容易に識別できるからです。
一方、PHPは、宣言なく変数を利用できますので、$color =としたときに、$colorが新しい変数の宣言なのか、既存の変数への代入なのかは、そこだけでは解釈できません。
一般に変数に型があり、宣言+代入をするコードと代入だけするコードが識別可能な構文の言語では、インスタンスを指すthisは省略しやすいですが、そうでない言語では省略しにくいです。(PHPの類例として、pythonでも"self.color"のように書きます)

言語作成の初期の段階から、$colorとしたとき、$thisに$colorがあればそれを参照したことにする、という仕様を採用していれば「$this->」を消すことも可能ではあったと思いますが、そうしなかった現状としては破壊的変更として影響度が大きすぎるのでもう方針転換は不可能だと思います。

投稿2019/03/25 02:41

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHPマニュアル「クラスの基礎」と「変数のスコープ」を併せてきちんと理解されたほうが良いかと思います。
Noteにもサンプルコードがあります。

言ってしまえば「そういう仕様」なので。
書いたとおりにしか動かないのがプログラムですが、「通り」は「プログラムの仕様通り」です。

投稿2019/03/24 12:42

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • スコープ内で有効
  • クラス内で有効
  • グローバルに有効

で使い分けます

PHP

1$x="hoge_x"; 2$y="hoge_y"; 3$z="hoge_z"; 4class foo 5{ 6 var $x="fuga_x"; 7 var $y="fuga_y"; 8 var $z="fuga_z"; 9 function bar(){ 10 $x="piyo_x"; 11 global $y; 12 print $x."<br>"; 13 print $this->x."<br>"; 14 print $y."<br>"; 15 print $this->y."<br>"; 16 print $z."<br>"; //グローバルでもスコープ内でも参照できないのでエラー 17 print $this->z."<br>"; 18 } 19} 20$c=new foo; 21$c->bar();

投稿2019/03/25 02:25

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問