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

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

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

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

オブジェクト指向

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

Q&A

解決済

3回答

233閲覧

PHPのクラス内でプロパティを定義する際の記述(全てに $this-> を付けるべきなのか)

H40831

総合スコア973

PHP

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

オブジェクト指向

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

0グッド

0クリップ

投稿2019/11/13 02:17

あらすじ

お世話になります。
現在勉強のためにプログラムを自主作成中です。

API的な処理をするPHPファイルにて、
グローバル変数に$_POSTのデータを定義していたのですが、
これはオブジェクト指向的に良くないと指摘され、変数定義の箇所を書き直しているところです。

状況

グローバル変数にて定義していた変数を、
コンストラクタで定義するようにお引越しさせていたところで疑問に思ったのですが、

PHP

1$id = $_POST['id']; 2$pw = $_POST['pw'];

としていた所をプロパティにする場合、そのままコピペしたら

class ○○{ public function __construct(){ $id = $_POST['id']; $pw = $_POST['pw']; } }

となり、これでも動作に支障はないように思えるのですが、ここでクラスには$this->という概念があることを思い出しました。
上記のコードで支障がなければ今後全てのプロパティを定義・参照する際に$this->を付加するのは手間ですよね。

つまり、下記のような記述です。

PHP

1class ○○{ 2 public function __construct(){ 3 $this->$id = $_POST['id']; 4 $this->$pw = $_POST['pw']; 5 } 6}

質問内容

「全てのプロパティは定義・参照する際に$this->を付けるべきなのか」
というところになります。
差し支えなければ、簡単に理由も添えていただけると理解が深まるので嬉しいです。

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

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

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

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

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

m.ts10806

2019/11/13 02:21

「支障がない」仮説は何を根拠とされているのでしょうか
m.ts10806

2019/11/13 02:22

というより、折角手元にコードがあるのでしたら検証されては?
H40831

2019/11/13 02:23 編集

class Hoge{   public function __construct(){     $hoge='hoge';     echo $hoge;   } } $hoge=new Hoge(); とすると、 「hoge」と出力されたためです。
m.ts10806

2019/11/13 02:26

そりゃ出ますよ。その場かぎりのローカル変数ですから。そのサンプルならわざわざ変数で受けとるのも無駄なコストです。 「どういう使い方をしたいか」部分を明示されたほうが良いです。
m.ts10806

2019/11/13 02:28

それにプロパティの宣言してないのでそもそも提示コードでは$this->idは使えません。 使い方も含めてPHPマニュアルのクラスの基礎をきちんと確認されたほうが良いです。
maisumakun

2019/11/13 02:33

> それにプロパティの宣言してないのでそもそも提示コードでは$this->idは使えません。 PHPの場合、勝手に代入してプロパティを増やしても問題なく動作します。
H40831

2019/11/13 02:35 編集

|というより、折角手元にコードがあるのでしたら検証されては? それについては、現在別の問題に困っております。 本来の質問から内容が逸れてしまうのですが、もしアドバイスいただけるなら幸いです。 現在作成中のプログラムは、PHPからPDOを使用して取得したデータを、Ajaxを使って取得するようなものです。(環境はAWSのEC2/RDSです) 今までブラウザのDevelopツールでの簡単な検証しかしたことなく、 バックエンド言語への着手が初めてなもので、 上記のような複雑なプログラムの検証をどのように行えばいいのか分かっていない状況です。 このままでは問題が起きるたびに人に相談する事になってしまうので、とてもモヤモヤしています。 たとえば現状、index以外のphpファイルのどこでエラーが発生しているのかとか、 エラーの内容など確認する術がわからないです。 そう行ったことを知る際にとるべき行動のヒントがあれば教えていただければ幸いです。 PHPのデバッグ方法など検索すると「ini_set('display_errors', 1); を記述すべし」くらいの情報ならすぐでてくるのですが、 API的な処理のエラー内容はindexに描画されないし、 POSTの値に依存する処理なので直接アクセスするわけにもいかず困っています。
m.ts10806

2019/11/13 02:43

maisumkunさん 失礼。私の方こそ未検証でした。事前に定義なく増やせる感覚になかなか慣れないですね。 H40831さん あくまで「検証」とは「いろいろなパターンのコードを書いてみて」という意図でした。当該変数にさまざまな形でアクセスパターンを書いてみようということですね。 エラーは結局エラーログに吐き出されます。なので画面に出ずともエラーログを確認すれば良いという話になります。 API的な処理のエラーがどこまでを意図しているのかわかりませんが、通常は別途ログをはく仕組みを書きます。file_put_contents()レベルでも十分です。デバッガを入れるのもありです。簡単なのはファイル出力ですね。
H40831

2019/11/13 02:56

m.ts10806さん ヒント頂いた知識を中心に、もっと勉強します! 教えていただき、ありがとうございます!
guest

回答3

0

ベストアンサー

全てのプロパティは定義・参照する際に$this->を付けるべきなのか

コンストラクタで定義する場合や、メソッドから読み書きする場合は、そのとおりです。PHPではそう書かないとローカル変数となってしまい、プロパティとして動作しません。

クラス直下に書く場合は、$fooだけでプロパティを意味します(なお、この場合定数式しか初期化に使えません)。

php

1class someClass { 2 // ここで宣言したものはプロパティになる 3 public $foo = 3; 4 5 public function __construct() { 6 // メソッド内からは$this経由が必要 7 $this->bar = date('Y'); 8 } 9}

投稿2019/11/13 02:19

編集2019/11/13 02:27
maisumakun

総合スコア145183

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

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

maisumakun

2019/11/13 02:20

なお、$this->$idではなく、$this->idと書いてください。$this->$idでは、「$idの変数に入った名前のプロパティを検索する」という別な意味になります。
H40831

2019/11/13 03:20 編集

まだPHPに慣れていないもので「プロパティ全部に$this->つけるの?まじ?」となっていたのですが、 クラス直下で変数を定義するというやり方があるのを、完全に忘れてました! 気づきを与えていただき、ありがとうございます! |$this->$idでは、「$idの変数に入った名前のプロパティを検索する」という別な意味になります。 $this->$id については凡ミスでした!気をつけます。 そういう感じの挙動になるんですね!補足いただき、ありがとうございます!
guest

0

おなじ変数内(スコープ内)でしか使わない変数をわざわざ$this->をつける必要はありません
逆にコンストラクタ内でローカルな変数をつかっても他の変数で利用できないので
おそらく今回のケースは$this->をつける案件です

PHP

1<?PHP 2class hoge{ 3 private $id,$pw; 4 public function __construct(){ 5 $this->id = filter_input(INPUT_POST,'id'); 6 $this->pw = filter_input(INPUT_POST,'pw'); 7 } 8 public function get_id(){ 9 return $this->id; 10 } 11 public function get_pw(){ 12 return $this->pw; 13 } 14} 15 16$hoge=new hoge; 17print $hoge->get_id(); 18print $hoge->get_pw(); 19?> 20<form method="post"> 21id:<input type="text" name="id" value="123"><br> 22pw:<input type="text" name="pw" value="hogehoge"><br> 23<input type="submit" value="send"> 24</form>

投稿2019/11/13 02:26

yambejp

総合スコア114827

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

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

H40831

2019/11/13 03:06

コメント中でのやりとりでも気付かされましたが、 たしかに質問文のコードで支障をきたさないのは、ローカル変数として使用する場合だけですね! 理解が深まりました!ありがとうございます!
guest

0

PHP では既に書かれているように、定義を記述する場合を除き、$this-> が必須になります。(static なプロパティについては class名::プロパティ名)

以下は一般的なオブジェクト指向言語での話。

コンストラクタではあまり意識する必要はありませんが、クラスのメソッドで引数がある場合、引数とプロパティ名が競合する可能性があります。
(特に private な property に対する setter メソッドの場合)
無論、メソッド内でのローカル変数もですが。

なので、冗長なのを承知の上で、必ず $this-> (に相当する記述)を付けるというのは(規約として)ありだと思います。

投稿2019/11/13 02:39

編集2019/11/13 04:02
tacsheaven

総合スコア13703

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

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

H40831

2019/11/13 03:08

なるほど、引数とプロパティの競合ですね・・・! より $this の必要性を実感できました! 具体的な例を交えてご説明いただけたので、とても納得しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問