2017-11-23 8 views
0

は、PHPのマニュアルからのテキストです:PHPのエンティティ 'Object'、 'Object Reference'、 'Object Identifier'、 'Object Accessors'とは何ですか?どのように機能するのですか?以下

PHP、各変数がオブジェクト参照ではなく オブジェクト全体のコピーが含まれていることを を意味し、参照またはハンドルと同じようにオブジェクトを扱います。

PHPリファレンスは別名で、2つの異なる変数が同じ値に書き込むことができます。 PHP 5以降、オブジェクト はオブジェクト自体を値として含まなくなりました。 には、オブジェクトアクセサーが実際のオブジェクト を見つけることを可能にするオブジェクト識別子が含まれています。オブジェクトが引数で送信されたとき、または が別の変数に割り当てられたとき、別の変数は別名ではありません。 これらは同じオブジェクトを指す識別子のコピーを保持します。

  1. 「オブジェクト」は正確に何を:私は私の心に疑問を以下まし上記のテキストを通過した後

  • 正確には「オブジェクトリファレンス」は?
  • 正確には「オブジェクト識別子」は?
  • 「オブジェクト識別子」と呼ばれるエンティティが暗黙的に/内部的に機能していますか?
  • 'オブジェクト識別子'のコピーを作成するにはどうすればよいですか?
  • 「オブジェクト参照」および「オブジェクト識別子」は同じことを意味しますか?
  • 正確には'オブジェクトアクセサ'は何ですか?
  • 「オブジェクトのインスタンス」用語に「クラスのインスタンス」を行い、「オブジェクト変数」"クラスのインスタンスの"オブジェクトインスタンスの同じことを意味ですか?はいの場合、これらのエンティティは何を示していますか?そうでない場合は、その意味の違いは何ですか?
  • 上記のエンティティはどのように機能しますか?

    私が理解しやすい、シンプルで明快な言葉を短く段階的に持っているかどうか疑問にお答えください。

    コード内の適切な場所に説明コメントを入れて、適切な作業コードの例を使ってこれらの概念を説明できるとよいでしょう。

    可能であれば、誰かがこれらの概念の作業の図解表現の助けを借りて説明することもできます。それは高く評価されるだろう。

    上記のすべての概念を説明するために、次の例を使用するか、独自の適切な例を指定することができます。

    <?php 
        class A { 
        public $foo = 1; 
        } 
    
        $a = new A; 
        $b = $a;  
    
        $b->foo = 2; 
        echo $a->foo."\n"; 
    
    
        $c = new A; 
        $d = &$c;  
    
    
        $d->foo = 2; 
        echo $c->foo."\n"; 
    
    
        $e = new A; 
    
        function foo($obj) { 
        $obj->foo = 2; 
        } 
    
        foo($e); 
        echo $e->foo."\n";  
    ?> 
    

    ありがとうございます。

    PHPマニュアルから参照リンク:

    1. https://secure.php.net/manual/en/oop5.intro.php#oop5.intro
    2. https://secure.php.net/manual/en/language.oop5.references.php#language.oop5.references
    +0

    あなたが引用されたマニュアルページへのリンクを追加してもらえますか? – Barmar

    +0

    @Barmar:質問の最後にそれぞれのリンクを追加しました。更新された質問の本文を参照してください。 – user2839497

    答えて

    2
    1. Objectあなたはnew Classnameで作成したクラスのインスタンスです。
    2. Object Referenceは、値がObjectのPHP変数です。
    3. Object Identifierは、特定のオブジェクトを識別するPHP実装内部の値です。おそらく、すべてのオブジェクトへのポインタを含む配列のインデックスのようなものでしょう。
    4. はい、内部的なので、PHPアプリケーションでは表示されません。
    5. オブジェクトを含む変数を別の変数に割り当てます。内部的に、両方の変数にはオブジェクト識別子のコピーが含まれています。
    6. これらは同じものではなく、密接に関連しています。オブジェクト参照はPHP変数であり、オブジェクト識別子はそれに含まれる内部データです。
    7. Object accessorsは、オブジェクトの内容にアクセスする操作です($d->fooなど)。
    8. はい、すべて本質的に同義です。

    これは、参照変数を明示的に使用しなくても、同じオブジェクトを参照する複数の変数を持つ方法の実装の詳細です。

    $a = new A; 
    $b = $a; 
    $a->foo = 2; 
    echo $b->foo; // echoes 2 
    

    割り当てはオブジェクトのコピーを作成していません。オブジェクト識別子をコピーするだけです。オブジェクト識別子のすべてのコピーは同じオブジェクトを参照します。それをCやC++のような言語のポインタのように考えてください。ポインタをコピーすると、両方の変数が同じメモリを参照します。

    オブジェクトのコピーを作成するには、cloneを使用する必要があります。

    $c = clone $a; 
    

    明示的な参照変数を使用しない限り、配列の動作とは異なり、割り当てによってコピーが作成されます。 (あなたがそれを変更しない限り、それは実際には配列のメモリをコピーしないように最適化として、PHPは、コピーオンライトを使用しています。)

    $x = array(1); 
    $y = $x; 
    $z = &$x; 
    $x[0] = 2; 
    echo $y[0]; // echoes 1 
    echo $z[0]; // echoes 2 
    
    +0

    @ Barmar:あなたの答えをありがとう。私が与えたコード例やその他の適切なコード例の助けを借りて、実際に(実際の使用時に)これらの概念を説明してください。可能であれば、これらのエンティティの実際の作業の図解表現は、これらの概念をよりよく理解する上で私にとってはるかに役立ちます。もう一度ありがとう。私はあなたの返事を熱心に待っています。 – user2839497

    +0

    これはすべての実装の詳細なので、実用的なデモンストレーションとして探しているものはわかりません。 – Barmar

    +0

    私は実際に私の質問で言及したコード例でこれらのエンティティのすべての作業の詳細を知りたいと思っています。このコードにコメントを追加して概念を説明したり、上記の概念を説明するコメントを含む他の適切な作業コードの例を追加することができます。だから、それは物事をはっきりとさせるでしょう。あなたの現在の答えでは、私は理論的に事実上の概念を理解する必要があります。だから、私はこれらの実体の実践を実証することを求めています。しかし、作業の絵の表現は、最も有用な援助だろう。ありがとうございました。 – user2839497

    関連する問題