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

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

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

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

Q&A

解決済

5回答

818閲覧

インスタンスの値の保持について

toll_tree

総合スコア199

PHP

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

1グッド

0クリップ

投稿2019/05/25 07:05

編集2019/05/25 07:33

こちらPHPマニュアルの説明で分からない部分があります。
「new」に関する説明で、「作成済みのクラスのインスタンスを新たな変数に代入する場合、新しい変数は、 代入されたオブジェクトと同じインスタンスにアクセスします」とあります。同じインスタンスにアクセスしているとなると、以下のコード(PHPマニュアルより抜粋)の$assignedもnullとなると思うのですが、何故$assignedはnullとならず、「"$assigned will have this value"」こちらの値を保持したままとなっているのでしょうか?

php

1class SimpleClass 2{ 3 // プロパティの宣言 4 public $var = 'a default value'; 5 6 // メソッドの宣言 7 public function displayVar() { 8 echo $this->var; 9 } 10} 11$instance = new SimpleClass(); 12 13$assigned = $instance; 14$reference =& $instance; 15 16$instance->var = '$assigned will have this value'; 17 18$instance = null; // $instance と $reference は null になります 19 20var_dump($instance); 21var_dump($reference); 22var_dump($assigned); 23?> 24?> 25
newyee👍を押しています

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

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

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

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

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

guest

回答5

0

こういう状況なのかな、と図示してみる。
イメージ説明

投稿2019/05/25 11:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

toll_tree

2019/05/25 13:30

ご回答ありがとうございます。 同じ入れ物を指しているといった点は、理解できたのですが、「$instance = null」ここの部分で、引っかかってしまったんですよね。 同じインスタンスを指しているなら、$assignedもnullになるのではないかな?と...
退会済みユーザー

退会済みユーザー

2019/05/26 07:31

$instance = null; はあくまで$instanceを潰しているだけ、という図も理解できませんか? $instanceも$assignedも、同じものを指し示しているだけの、別のものであると。
toll_tree

2019/05/26 07:36

なんとなくですが、提示頂いた図で理解できてきました。 同じものは指しているが、別物であるということなんですね。
guest

0

ベストアンサー

同じインスタンスにアクセスしているとなると、以下のコードの$assignedもnullとなると思うのですが

変数への代入操作は、インスタンスそのものを書き換える操作ではなく、インスタンスと紐付けられている変数の関係を書き換える操作です。なので、同じインスタンスを別に保持している$assignedには影響しません。

投稿2019/05/25 07:21

編集2019/05/25 07:23
maisumakun

総合スコア145184

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

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

m.ts10806

2019/05/25 07:27 編集

なるほど、そっちですね。 引用しているコードなのか自分で組んだコードなのかくらいは書いてほしかった。 何もないと単純ミスのほうが目立って本題が見えにくい。
toll_tree

2019/05/25 07:30

コードはPHPマニュアルからの引用です。
m.ts10806

2019/05/25 07:31

質問本文に書かないと後から見た人に伝わりません。
toll_tree

2019/05/25 07:31

追記しときます
toll_tree

2019/05/25 07:50

@maisumakunさん ご回答ありがとうございます。 >同じインスタンスを別に保持している$assignedには影響しません。 こちらの部分なのですが、「$instance = null」こちらの1行のみを削除して、実行してみましたら、 var_dump($assigned)は以下の値を保持していました。 「["var"]=> string(30) "$assigned will have this value"」 $assignedに影響がないとすると、「$instance->var = '$assigned will have this value'」こちらで代入した値も$assignedが持つことはできないのではないかと思うのですが、何故「$assigned will have this value'」こちらの文字列を$assignedは所持できるのでしょうか?
maisumakun

2019/05/25 07:56 編集

プロパティへの代入は、オブジェクト自体を書き換えます($instanceと$assignedで共通のインスタンスを書き換えてしまいます)。
toll_tree

2019/05/25 08:08

@maisumakunさん すみません、まだ少し引っかかっている部分があるのですが、プロパティへの代入は共通のインスタンスを書き換えているとすると「$instance = null」こちらは共通のインスタンスではなく、$instanceのみの値を書き換えているという解釈であっていますでしょうか?
maisumakun

2019/05/25 08:36

> こちらは共通のインスタンスではなく、$instanceのみの値を書き換えているという解釈であっていますでしょうか? はい、インスタンスとは無関係に変数へnullを代入しています。
guest

0

$reference =& $instance;

は今のレベルでは混乱の元なのでひとまず無視して考えた方がいいでしょうね。

$assigned = $instance;
としたら
どちらも同じもの参照しますよって言うだけの話です。

投稿2019/05/25 07:30

hentaiman

総合スコア6421

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

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

toll_tree

2019/05/25 08:10

ご回答ありがとうございます。 ひとまず、「$reference =& $instance;」こちらの部分はおいておこうと思います。
toll_tree

2019/05/25 14:42

調べたのですが、「$reference =& $instance;」こちらは参照代入というのですね。 どうも引っかかる部分としましては、 「$assigned = $instance;」こちらで、同じものを参照するのだとしたら、「$instance = null;」こちらにnullを入れた時点で、$assignedもnullを参照するのではないかなーと思うんですよね...
hentaiman

2019/06/01 15:23 編集

読んで無さそうで無駄なので削除
guest

0

PHPマニュアル:文字列#引用符

注意: ダブルクォート 構文や heredoc 構文とは異なり、 変数と特殊文字のエスケープシーケンスは、 引用符 (シングルクオート) で括られた文字列にある場合には展開されません。

php

1$hoge = "a"; 2echo '$hoge bc'; 3echo "$hoge bc";

「インスタンスの問題だ」と思ってると理解は難しい。
結局は代入の仕方と変数の基礎の問題。

php

1$a='a'; 2$b=$a; 3$c=&$a; 4 5$a='d';

それぞれの変数がどうなっているか確かめてみては。
自分でミニマムコード組んでみないと思い込みばかりでは何も進まないですよ、

※ここで「~だと思ったんですよね」と返すようなら余地はないです。
自分で組んでみないと分からないわけだから。組み直すの面倒なら値変えたりしてみればいい話
trial and error が足りてないだけです(やってないって言ったほうが正しいか)

投稿2019/05/25 07:20

編集2019/05/25 21:46
m.ts10806

総合スコア80850

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

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

m.ts10806

2019/05/25 07:42

nullと出ない理由を答えてなぜ低評価か・・・。 画面にnullと出るわけではないですけど。
guest

0

php

1$instance->var = '$assigned will have this value';

php

1$instance->var = "$assigned will have this value";

投稿2019/05/25 07:08

編集2019/05/25 07:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

toll_tree

2019/05/25 07:19

シングルクォートをダブルクォートで囲ったことは何を意味しているのでしょうか?
maisumakun

2019/05/25 07:22

そこも間違いかもしれませんが、今回の疑問とは関係ないかと思われます。
退会済みユーザー

退会済みユーザー

2019/05/25 07:29 編集

検証コード書くなら正しいコードでないと検証できませんから クラス以前の問題だし。
maisumakun

2019/05/25 07:31

(というより、「$assigned」と表示したいのだから一重引用符のままが正しいんじゃないかと、今更思った次第)
退会済みユーザー

退会済みユーザー

2019/05/25 07:34

あら、ほんとだわ
m.ts10806

2019/05/25 07:34

maisumakunさん その意図が質問者に伝わっているかどうかは別問題なのはわかりますが・・・ 今回の提示されたコードを理解するために求められる前提知識がかなり多いので、そこが抜けてる状態だとかなり厳しいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問