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

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

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

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

オブジェクト指向

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

コンストラクタ

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

Q&A

解決済

2回答

1221閲覧

phpオブジェクト指向のコンストラクタ

TAONE

総合スコア18

PHP

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

オブジェクト指向

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

コンストラクタ

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

0グッド

0クリップ

投稿2019/03/26 14:50

編集2019/03/28 11:06

phpでオブジェクト指向の学習をしています

よく初学者向けのブログや書籍でコンストラクタを説明するコードで

php

1<?php 2 3class Staff { 4 5public $name; 6public $age; 7 8public function __construct($name,$age) { 9 $this->name = $name; 10 $this->age = $age; 11} 12} 13 14$tanaka = new Staff("tanaka",59); 15echo $tanaka->name; 16echo $tanaka->age; 17 18?>

こういったのを見るのですが
$nameと$ageが多くていささか混乱しています。
自分なりの解釈では

php

1class Staff { 2 3 public $name; 4 public $age; 5 6 public function __construct(**$name**,$age) { 7 $this->name = **$name**; 8 $this->age = $age; 9 }

アスタリスクで囲われた&meiペアが同じもので
$this->nameと
public $name;
のペアが同じものなのかと思い
下記のようなコードに変えてみたらエラーなく出力ができました。
*$ageは割愛

php

1 2<?php 3class Staff { 4 5 6 public $name; //とりあえずクラス内に変数を作っただけ 7 public $age; 8 9 public function __construct($mei,$toshi) { 10 $this->name = $mei; //新しくインスタンス作ったときに(引数)の中の値を変数$meiに格納してインスタンス田中の変数nameに代入 11 $this->age = $toshi; 12 } 13} 14 15$tanaka = new Staff("tanaka",59); //設計図スタッフから田中っていう変数2つ持ったインスタンス生成(引数で$meiと$toshiに渡す) 16 17echo $tanaka->name; //田中の変数name呼び出し 18echo $tanaka->age; //田中の変数age呼び出し 19//tanaka59が表示 20?>

この自分の解釈は間違っているでしょうか?
またもし合っていたとして
初学者向けの参考所でこのような混乱をきたすような書き方をされる理由など
なにかあると思うのですが
単に作法的なものなのか
クラスのプロパティ名とコンストラクタの引数名が
同じじゃないといけないみたいな理由があるのでしょうか?

またコメントアウトで自分用のメモとして解釈を書き加えたのですが
このメモの解釈で合っていますでしょうか?
よろしければ回答ください

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

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

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

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

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

guest

回答2

0

ベストアンサー

これはクラスじゃなくて単なる関数の場合でも、ですが、同じじゃなければいけない理由はないです。
aとかbとかでも良いです。数さえ合ってれば。
ただ、コメントでも書かれているようにクラスは設計書、ですが、
あくまで機能を提供するだけなのでどこからどう使われるかどうか知りません。渡された情報を正直に設計通りに処理をしているだけです。
つまり、外から来る情報が何かは知らないわけですね。1番目に何を渡してね、2番目に何を渡してね、とはしていますが。
ということは受け取った情報をプロパティと同じ名称にしておいた方が設計書における混乱が少ないわけです。

変数名とは言っても英単語や日本語ローマ字として意味があるわけではなく単なるアルファベットと数字の羅列です。一字でも違ったら(大文字小文字すらも)それは別物として扱われるのがプログラミングの世界なので、合わせておくのが妥当です。

蛇足。
初心者向けの書籍で出版や対象バージョンが古ければ載っていないかもしれませんが、「型宣言」というものがあり、引数や返り値の型をチェックする機能もあります。←はわりかし新しい機能ですが、
結構古くからある「デフォルト引数」という機能もあります。

先に書きましたようにクラス側、メソッド側は「どう使われるか知らない」ので、こういった機能を使ってより厳格な設計、コーディングを心がけると良いと思います。

投稿2019/03/26 22:08

編集2019/03/27 01:19
m.ts10806

総合スコア80850

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

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

maisumakun

2019/03/26 23:13

本題ではありませんが、PHPは「関数名の大文字小文字は区別しない」「定数は、作成時に大文字小文字を区別するか選べる」など、大文字小文字の区別に関して一貫しない仕様となっています。 https://qiita.com/tadsan/items/6c6329eeb43929271119 もっとも、「区別されるつもりだったけど実は区別されなかった」で困るパターンが「大文字小文字の違いだけで同じ名前を作ろうとしていた場合」程度なので、区別されることを前提に動けば大問題にならないとは思います。
m.ts10806

2019/03/26 23:59

そうなんですよね。そこで動いてしまうところが怖いところで、 「関数名が関係なく出来るから変数も大丈夫だろ」でやってしまう初心者がそれなりにいそうに思います。 そういう仕様はそろそろ滅びればいいのに・・・と思い続けて何年も経ってます。 「定義したものはコピペで使いましょう」を徹底するのが最も間違いないと思ってます。
guest

0

理解はあっていると思います。

こう書くのは、変数はその内容を適切に表現する英語で表記するのが普通だからです。日本語の例で考えたとき、meiではなくseiとしたとき姓か性かわからなくなります。
実用上、むしろ同じ名前にしたほうが便利だと思うのですが。

投稿2019/03/26 21:32

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問