0

私はPHP、OOPを勉強していて、たくさんのことを学びましたが、私をからかう小さなことがあります。

オブジェクト作成の説明のために作成した画像があります:リンク

誰かがいくつかの質問に答えることができたら...

  • 画像に何か問題があった場合、誰かが私を訂正してくれると嬉しいです。
  • オブジェクトをエコーし​​ようとすると、メモリ位置名の文字列でない場合、オブジェクト(オブジェクトがメモリ参照であることを理解しています)を文字列に変換できないというエラーが表示されます(例:「F70」 )メモリの場所がどのように見えるかについて、例を教えてください。
  • そして、参照を含む変数については、これが残りのすべてのグローバル変数とともに配置される通常の変数であることを理解しています。つまり、新しいオブジェクトと新しい変数を作成すると、最初のオブジェクト(変数)に参照が含まれますが、通常のグローバル変数。他の変数も同じです。

最初のステップ:オブジェクト変数を定義します...

2番目のステップ:作成されたオブジェクトとそのメモリ位置が必要な変数内に入ります...

3番目のステップ:参照を使用して作成された新しいグローバル変数。

Object(変数)を呼び出すとはどういう意味ですか?

最初のステップ:変数が作成されたメモリ位置に移動します...

2番目のステップ:オブジェクトが存在するメモリ位置を参照する変数値(参照)...

3番目のステップ:そのオブジェクトのメソッドとプロパティにアクセスできます。

誰かが私がこのことを理解するのを手伝ってくれるなら、私は幸せです、みんなに感謝して、良い一日を過ごしてください。

4

5 に答える 5

3

PHPはメモリ参照を返しませんが、クラスのインスタンスを返します。一般に、オブジェクトがメモリ内のどこで作成および保存されるかは不明です。それでもPHPでメモリの場所と参照を操作する必要がある場合は、Stack Overflowにすでにすばらしい答えがあります。PHPの変数のメモリの場所を確認するにはどうすればよいですか?。PHPでのOOPの使用法については、php.netのクラスとオブジェクトのマニュアルを確認する必要があります。

オブジェクトのエコーについて:オブジェクトをエコーする場合は、オブジェクトを文字列として表す方法を指定する__toString() マジックメソッドを定義する必要があります。あなたの場合、これは

<?php
class x {
    public function num() {
         return 5;
    }
    public function __toString() {
         return $this->num();
    }

}
$ob = new x();
echo $ob; // outputs 5

PHPでは、$obはメモリ位置への参照ではなく、クラスのインスタンスです。したがって、メソッドecho $ob->num();を定義せずに呼び出すこともできます。__toString()

于 2012-06-04T08:54:00.493 に答える
1

私はPHPプログラマーではありませんが、混乱を少なくするために少なくとも少しはお手伝いできるかもしれません。

繰り返しになりますが、php(インタプリタ言語であるため)が実際にオブジェクトの作成をどのように処理するかはわかりませんが、C++の方法に非常に近いはずです。結局のところ、同じハードウェアで実行されます。

つまり、クラスがコンパイラ(インタプリタ)の「テンプレート」であることがわかります。ただし、実際にオブジェクトが何であるかを理解する必要があります。オブジェクトは実際には情報の表のようなものです。クラスの変数が含まれています。メソッドは含まれていません。

したがって、演算子を使用してオブジェクトを作成するnewと、この「テーブル」がメモリ内に作成され、値が入力されます。このテーブルにはベースアドレスがあります。これはオブジェクト変数に割り当てられます。

ここで重要なのは、オブジェクトには実際のメソッドが含まれていないということです。これらはメモリ内の他の場所で作成されます。オブジェクトメソッドを呼び出すときは、実際には「通常の」関数を呼び出し、コンパイラはオブジェクト(そのテーブル)のアドレスをそのパラメータの1つとしてオブジェクトに渡します。

これは非常に単純化されています。しかし、私はそれがあなたがイメージするのを助けるべきだと思います、コンピュータが実際にバックグラウンドで何をするか。

于 2012-06-04T08:57:57.273 に答える
1
  1. オブジェクトの文字列表現を得るには、関数を実装する必要があります__toString()

  2. 内部メカニズムに関しては、あなたが思っているよりもはるかに複雑です。PHPは動的言語であるため、すべてのクラス、すべてのクラスオブジェクトについて多くの情報を保持する必要があります。文字列変数に必要なメモリだけでなく、関数マッピング、メモリ管理構造、型構造、デフォルトなどもあります。さらに詳しく知りたい場合は、こちらをお読みください。

于 2012-06-04T08:42:26.463 に答える
1

すべてのPHP変数は「zval」として保存されます。

zvalの詳細:http://docstore.mik.ua/orelly/webprog/php/ch14_06.htm

zvalの内部情報をダンプする関数:http://php.net/manual/en/function.debug-zval-dump.php

于 2012-06-04T08:43:12.927 に答える
1

オブジェクトをエコーし​​ようとするときは、クラスの__toString()マジック関数をオーバーライドする必要があります。この記事http://net.tutsplus.com/tutorials/php/object-Oriented-php-for-beginners/を読むことをお勧めします。それはほとんどあなたの質問に答えます。

于 2012-06-04T08:44:35.807 に答える