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

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

ただいまの
回答率

87.92%

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 937

score 35

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

class SimpleClass
{
    // プロパティの宣言
    public $var = 'a default value';

    // メソッドの宣言
    public function displayVar() {
        echo $this->var;
    }
}
$instance = new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance;

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

$instance = null; // $instance と $reference は null になります

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/06/25 09:20

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 5

checkベストアンサー

+3

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 16:56 編集

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

    キャンセル

  • 2019/05/25 17:08

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

    キャンセル

  • 2019/05/25 17:36

    > こちらは共通のインスタンスではなく、$instanceのみの値を書き換えているという解釈であっていますでしょうか?

    はい、インスタンスとは無関係に変数へnullを代入しています。

    キャンセル

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 22:30

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

    キャンセル

  • 2019/05/26 16:31

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

    キャンセル

  • 2019/05/26 16:36

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

    キャンセル

+2

$reference  =& $instance;


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 17:10

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

    キャンセル

  • 2019/05/25 23:42

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

    キャンセル

  • 2019/05/26 00:33 編集

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

    キャンセル

+1

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

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

$hoge = "a";
echo '$hoge bc';
echo "$hoge bc";

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

$a='a';
$b=$a;
$c=&$a;

$a='d';


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 16:42

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

    キャンセル

-4

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 16:31

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

    キャンセル

  • 2019/05/25 16:34

    あら、ほんとだわ

    キャンセル

  • 2019/05/25 16:34

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

    キャンセル

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る