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

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

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

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

Q&A

解決済

2回答

1226閲覧

PHPのget_class_vars()でコンストラクタが無視される理由がわかりません

tokyodesk

総合スコア56

PHP

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

0グッド

0クリップ

投稿2018/12/09 06:43

以下のようなPHPで、

class class_var_a { public $a = 1; public $aa = 'aaa'; public function __construct() { $a = 2; $aa = 'a2'; } } $i = new class_var_a(); $i_classname = get_class($i); $p = get_class_vars($i_classname); print_r($p);

コンストラクタはget_class_varsでクラスのデフォルト値を取得する上で全く関わらないようですが、これはget_class_varsはクラスの定義文の記述内容の中のプロパティを直接定義している部分(public $a = 1;public $aa = 'aaa';)しか見ていないからということでしょうか。
侍エンジニアのサイトで勉強していますが、そこでは「get_class_vars関数は、実行時のスコープから参照できる範囲の値を取得」することが、コンストラクタが無視される理由であると説明されていますが、この説明が理解できませんでした。
スコープは単に変数の取り得る値の範囲のことだと思っています。
コンストラクタで書き換えてもそれはデフォルト値が変更されたわけではないから、get_class_varsで無視されると思っておけばいいのでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

get_class_vars()の引数はクラス名です。
PHPマニュアル

提示の例の場合に合わせると以下の様に書いても動作は全く同じになります。

PHP

1class class_var_a 2{ 3 public $a = 1; 4 public $aa = 'aaa'; 5 6 public function __construct() 7 { 8 $a = 2; 9 $aa = 'a2'; 10 } 11} 12$p = get_class_vars("class_var_a"); 13print_r($p);

get_class_vars()の引数はクラス名ということはオブジェクトの状態はget_class_vars()の動作には一切影響を与え得ないという事も意味します。(上記例示ではオブジェクトが存在しないことからも確認出来ます)

コンストラクタはオブジェクトが生成される際に実行され、オブジェクトに影響を与える関数であるため、get_class_vars()の動作を影響を与えることは出来ません。

get_object_vars()と挙動を比較すると理解しやすいかもしれません。

投稿2018/12/09 08:08

tanat

総合スコア18713

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

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

tokyodesk

2018/12/09 20:21

get_class_varsはクラス名だけで処理しているという観点が抜け落ちていました。 get_class_vars()はオブジェクトには干渉しないんですね。 大変助かりました ありがとうございます。
guest

0

勘違いしていたので書き直し。

「デフォルトのプロパティ」なので後から定義されたもの、その値は含まれないという理解で良いと思います。

投稿2018/12/09 07:11

編集2018/12/09 07:14
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/12/09 07:19

それにそもそも コンストラクタ内だけの変数は返さないしね
m.ts10806

2018/12/09 09:00

もうちょっと検証パターン増やした方が良さそうですね
tokyodesk

2018/12/09 20:20

侍エンジニアの「実行時のスコープ」という書き方で「???」となっていましたが、後から定義されたものはデフォルトではないと考えれば納得がいきました。 ありがとうございます。
m.ts10806

2018/12/09 22:44

解決されたようで何よりです。 あまり悪く言いたくはないですが、侍エンジニアはものにより記事の質があまり良くないので、Qiitaの評価の高い記事か、確実なのはPHPマニュアルをしっかりと読みこむことですね。
退会済みユーザー

退会済みユーザー

2018/12/09 23:45

非常識な結果を残したとか失礼だしな、 本人は侍じゃ足らんとし自己研鑽している人達のはずだし あの書き方だと、教えてることではなれないと自分から暴露してるからな。 自己研鑽は非常識らしいということだ(笑)
m.ts10806

2018/12/09 23:56

asahina1979さん ちょっとどのこと言ってるか分からないです…
m.ts10806

2018/12/09 23:59

あ、理解しました。あの表現はよくないですね確かに
tokyodesk

2018/12/10 08:31

侍エンジニアはわかりやすいと感じていましたが、記事によってばらつきがあるんですね。 気を付けます。 PHPマニュアルをできるだけ正確に理解できるようにしたいと思います。 Qiitaはわからない専門用語がたくさん使われていて理解しづらいと感じていたのですが、こちらも専門サイトなので読み込むようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問