PHPでオブジェクト指向を学んでいる際に、ふと疑問に感じました。
$this->はなぜ使われているのでしょうか?
// 車クラス class Cars { // プロパティー public $colors = '赤'; // 走るメソッド public function run() { $this->colors = '緑'; echo "走る"; } }
上記の
$this->colors = '緑';
は、下記のコードでは表すことはできないのですか?
$colors = '緑';
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア6621
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/24 05:26
2019/03/24 05:29
2019/03/24 05:56
2019/03/24 06:00
2019/03/24 12:38
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
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア114843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。