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

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

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

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

Q&A

解決済

2回答

1999閲覧

PHPのコンストラクタ?の動作が理解できません。

kantowebmanager

総合スコア29

PHP

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

0グッド

1クリップ

投稿2018/05/03 02:27

編集2018/05/03 03:20

以下のようなプログラムを書きましたが、表示結果はtest2ああああああです。
このうち、「ああああああ」が出力される原因がわかりません。
宣言していない$cの中身になぜか$this->$bbの値が代入されてます。

<?php class aa { public function func() { $this->$bb = 'ああああああ'; $b = 'test2'; return $b; } // 追加 public $c = 1; } $x = new aa(); echo $x->func(); echo $x->$c;

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/03 02:29

Notice: Undefined variable が出ないようにデバッグしよう、話はそこからだ。
退会済みユーザー

退会済みユーザー

2018/05/03 02:53

これ、いくつかのバージョンで試しましたが、動きません。動作したバージョンはいくつでしょうか?Fatal error: Cannot access empty property in on line 6
kantowebmanager

2018/05/03 03:16

phpのバージョンはコマンドを叩いてみたところ「PHP 7.1.7 (cli) (built: Jul 15 2017 18:08:09) ( NTS )」と出ました。エラーの出し方のデフォルトの設定内容が原因かもしれませんが私の環境ではエラーメッセージが全く出ないです。
退会済みユーザー

退会済みユーザー

2018/05/03 04:02 編集

public $c = 1;足したね? それを参照したいなら、echo $x->c;だよ、echo $x->$c;じゃないよ
guest

回答2

0

echo $x->func(); 実行後

test2object(aa)#1 (2) { ["c"]=> int(1) [""]=> string(18) "ああああああ" }

という風に無名領域に設定されます。

なので echo $x->$c; 実行時に グローバルの$c は は 未定義("") 扱いになるため

# 便宜上 Array 表記にしてます。 echo $x[$c]; # ↓ echo $x[""]; # オブジェクトへのアクセスの場合はこれの模様 echo $x->$c; # ↓ echo $x->{""};

よって "ああああああ" が出力されます。

投稿2018/05/03 03:44

編集2018/05/03 04:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/05/03 03:47

やっぱり無名領域だったんですね (それにしても、質問者さんがなぜにアローのあとに$をつけたがるのか)
退会済みユーザー

退会済みユーザー

2018/05/03 03:50

この動き気持ち悪いんだけどね・・・ オブジェクトを想定外にいくらでも拡張できるのって
退会済みユーザー

退会済みユーザー

2018/05/03 03:56

このスクリプトって動かせるんですか? ちょっと試してみたいんですけど、いくつかの環境でやってみても $bb がジャマで動かない。
退会済みユーザー

退会済みユーザー

2018/05/03 04:12

Noticeで止まるように設定していると動かないよ
退会済みユーザー

退会済みユーザー

2018/05/03 04:17

同じ行で Fatal error: Uncaught Error: Cannot access empty property in /workspace/Main.php:6 がでてるんで、そのままだと無理かと思ってるんですけど、動きます?
退会済みユーザー

退会済みユーザー

2018/05/03 04:17

設定で動いてしまう、不思議ちゃんのPHP
退会済みユーザー

退会済みユーザー

2018/05/03 04:21

ideone では PHP 7.1 か
kantowebmanager

2018/05/03 04:51

リクエストに答えてくださりありがとうございます。 他の方々もありがとうございます。 「$x->$c」は「$x->c」に、「$this->$b」は「$this->bb」にしたら意図した通りの動きになりました。 $をつけるとエラーになる仕組みなのですが、「test2object(aa)#1 (2) { ["c"]=> int(1) [""]=> string(18) "ああああああ" }」は何がどうなっているのか正直全くわかりませんでした。 もしよければ初学者の私にも理解できるようにわかりやすくご解説していただきたいのですが。
退会済みユーザー

退会済みユーザー

2018/05/03 08:36

> 設定で動いてしまう、不思議ちゃんのPHP わからん^^; set_error_handler + try catch でイケるかと思ったけど、ダメっぽい。 asahina1979 さん、どこの設定弄べばよいかぜひご教示ください!
退会済みユーザー

退会済みユーザー

2018/05/03 09:53

te2ji 初期設定(XAMPP 7.2.x) でもとおっていて、動かない人がいるってことで設定と結論してますのでどこの設定かはわからないですね。 クラスの規定が array か stdClss になってるかで違うようですがなにか設定あるんでしょうかね?
退会済みユーザー

退会済みユーザー

2018/05/03 09:58

あぁ、そういう意味ですね。 ちょっとコメントの意味を理解できていなかったようです^^; もし分かったら報告します。 *ちょっと闇が深そうなので放置するかも。。。
退会済みユーザー

退会済みユーザー

2018/05/03 09:59

ありがとうございました。 > kantowebmanager さん 横からごちゃごちゃ言ってすみません!
退会済みユーザー

退会済みユーザー

2018/05/03 10:01

kantowebmanager エラーというか Notice は未定義値にアクセスしてるからスペルミスなっじゃないの?という警告ですね。
kantowebmanager

2018/05/03 11:12

>asahina1979さん 上記の件について教えていただきたいのですが。
guest

0

ベストアンサー

aa::func()にて、
$bbが未定義のため
クラスaaの未定義な領域(というかデフォルトな名前$)に'ああああああ'が格納されている状態で、
echo $x->$c;したら、
クラスaaのインスタンス$xの、これまた未定義な$cのために、
未定義な領域($x->$)の'ああああああ'が得られた、
ってことなのかなぁ、
適切な用語じゃない気もしますが。

Notice: Undefined variableを出さずに再現しようとすると、こんなコードになります。

php

1<?php 2 3class aa 4{ 5 public $var_a; 6 public function func() 7 { 8 $bb = "var_a"; 9 $this->$bb = 'ああああああ'; 10 $b = 'test2'; 11 12 return $b; 13 } 14} 15$x = new aa(); 16echo $x->func(); 17$c = "var_a"; 18echo $x->$c; 19exit();

実行結果
クラスaa内の公開プロパティvar_aがあって、
aa::func()内の処理として
$bbに"var_a"という文字列が入っていれば、
$this->$bb
$this->var_aと同じ意味になります。

でも、プロパティ名やメソッド名を変数で与えて動的にアクセスするケースは
高度な実装場面のような気がするので、初学者は混乱のもとになるだけです。


php

1<?php 2class aa 3{ 4 public function func() 5 { 6 $this->$bb = 'ああああああ'; 7 $b = 'test2'; 8 9 return $b; 10 } 11 12 // 追加 13 public $c = 1; 14} 15$x = new aa(); 16echo $x->func(); 17echo $x->c; // class aa内のプロパティ$cにアクセスするには、こうする

投稿2018/05/03 02:32

編集2018/05/03 04:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kantowebmanager

2018/05/03 03:26

コメントありがとうございます。 上記のように「public $c = 1;」として値を指定しましたが、結果は同じでした。 「プロパティやメソッドを文字列で与えて動的にアクセス」とはどういう意味なのでしょうか。 文字列が原因なのかと思い、 'ああああああ'や'test2'のところを数字に変えてみたのですが同じでした。 原因がわかりません。。
退会済みユーザー

退会済みユーザー

2018/05/03 03:50

《プロパティやメソッドを文字列で与えて動的にアクセス》とは、回答内にも書いた、 クラスaa内の公開プロパティvar_aがあって、 aa::func()内の処理として $bbに"var_a"という文字列が入っていれば、 $this->$bbは $this->var_aと同じ意味 のことです。アロー「->」の後に$をつけてしまうと、 $で示す変数を参照して名前が一致するプロパティやメソッドにアクセスする流れになりますので。
kantowebmanager

2018/05/03 04:54

そういうことだったんですね。 $を外したらうまくいきました。 私の文法ミスでした。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/05/03 05:32

プロパティ名やメソッド名を変数で与えて動的にアクセス、と言い換えました。
kantowebmanager

2018/05/05 00:51

なるほどですね。 このたびはありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問