オブジェクト指向プログラムの単位はオブジェクトですが、オブジェクトはクラスによってインスタンス化されます。クラスが宣言されたので、次のステップはオブジェクトをインスタンス化することです。ここではオブジェクトをインスタンス化する方法を紹介します。
クラスを定義した後、new キーワードを使用してオブジェクトを生成します。
$オブジェクト名 = 新しいクラス名();
<?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() { //这个人可以说话的方法 echo "这个人在说话"; } function run() { //这个人可以走路的方法 echo "这个人在走路"; } } $p1=new Person(); $p2=new Person(); $p3=new Person(); ?>
$p1=新しい人();
#このコードは、クラスを通じてインスタンス オブジェクトを生成するプロセスです。$p1 は、インスタンス化するオブジェクトの名前です。同様に、$p2 と $p3 も、インスタンス化するオブジェクトの名前です。クラスインスタンス化が可能です。複数のオブジェクトが生成され、それぞれのオブジェクトは独立しています。上記のコードは 3 人の例に相当します。各人の間につながりはありません。これは、全員が人間であることを意味するだけです。各人は独自のものを持っています。名前、性別、年齢属性など、誰もが話し方や歩き方を持っています。メンバー属性とメンバー メソッドがクラスに反映されている限り、インスタンス化されたオブジェクトにはこれらの属性とメソッドが含まれます。PHP のオブジェクトも、整数や浮動小数点型と同様のデータ クラスです。これらはさまざまな型のデータを保存するために使用され、操作中にメモリにロードする必要があります。記憶に反映される? メモリは通常、論理的に 4 つのセグメントに分割されます。
スタック領域セグメント、ヒープ領域セグメント、コードセグメント、 静的メモリの初期化セグメント , ①.スタック空間 セグメント
スタックは、スペースは小さいが CPU からのアクセスが速いという特徴があり、プログラムを格納するためにユーザーが一時的に作成する変数です。スタックの後入れ先出しの性質により、スタックは通話シーンの保存と復元に特に便利です。この意味で、スタックは一時的なデータの保存と交換のためのメモリ領域と考えることができます。一定の長さと小さな領域を占有するデータ型を格納するために使用されるメモリ セグメント。たとえば、整数 1、100、10000 などはメモリ内の同じ長さの領域を占有し、占有される領域は 32 ビットと 4 バイトです。 Double、boolean などもスタック領域セグメントに格納できます。
②. ヒープ領域セグメント
ヒープは、プロセスの実行中に動的に割り当てられるメモリ セグメントを格納するために使用され、そのサイズは固定されておらず、動的に拡張または縮小できます。可変データ長または大量のメモリ使用量のデータを格納するために使用されます。たとえば、文字列、配列、オブジェクトがこのメモリに保存されます。
③. データセグメント
データセグメントは、実行ファイル内で初期化されたグローバル変数、つまりプログラムによって静的に割り当てられた変数を格納するために使用されます。
④.コードセグメント
コードセグメントは、実行可能ファイルの操作命令を格納するために使用されます。つまり、メモリ上の実行可能プログラムのイメージです。コード セグメントは実行時に不正に変更されるのを防ぐ必要があるため、読み取り操作のみが許可され、書き込み (変更) 操作は許可されません。たとえば、プログラム内の関数はこのメモリに格納されます。
オブジェクト型データは比較的大きな空間を占有するデータ型であり、可変長の空間を占有するデータ型であるため、オブジェクト作成後はメモリ上に格納されますが、オブジェクトへの参照はスタック内にまだ保存されています。プログラムの実行中、メモリ内のデータには直接アクセスできますが、ヒープ メモリは直接アクセスできないメモリですが、オブジェクトの参照名を通じてオブジェクト内のメンバにアクセスできます。
プログラム内の異なる宣言は、異なるメモリ セグメントに配置されます。
スタック領域セグメントは、同じ領域長を占有し、より少ない領域を占有します。整数 1、10、100、1000、10000、100000 などのデータ型はメモリ内で同じ長さのスペースを占有し、すべて 64 ビットと 4 バイトです。では、データ長が可変で、大きなスペースを占めるデータ型はメモリのどのセグメントに配置されるのでしょうか?このようなデータはヒープ メモリに配置されます。
スタックメモリには直接アクセスできますが、ヒープメモリには直接アクセスできません。
私たちのオブジェクトの場合、それは大きなデータ型であり、可変長の領域を占有するため、オブジェクトはヒープに配置されますが、オブジェクト名はスタックに配置されます。これにより、オブジェクトをオブジェクト名を通じて使用できるようになります。$p1=new Person();
このコードの場合、$p1 はスタック メモリ内のオブジェクト名、new Person() はヒープ メモリ内の実際のオブジェクトです。内部の詳細については、下の写真をご覧ください:
从上图可以看出$p1=new Person();等号右边是真正的对象实例, 在堆内存里面的实体,上图一共有3次new Person(),所以会在堆里面开辟3个空间,产生3个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP里面,只要有一个new这个关键字出现就会实例化出来一个对象,在堆里面开辟一块自己的空间。
每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性别和年龄。每个属性又都有一个地址。
$p1=new Person();等号的左边$p1是一个引用变量,通过赋值运算符“=”把对象的首地址赋给“$p1“这个引用变量, 所以$p1是存储对象首地址的变量,$p1放在栈内存里边,$p1相当于一个指针指向堆里面的对象, 所以我们可以通过$p1这个引用变量来操作对象, 通常我们也称对象引用为对象。
验证:
class Person{ public $name; } $obj1 = new Person(); $obj1->name = "test1"; echo $obj1->name; $obj2 = $obj1; $obj2->name = "test2"; echo $obj1->name; echo $obj2->name;
通过测试结果来看,解释是对的。
$p1 是对象的指针而不是对象本身, obj2和 obj1都指向同一块内存,同一个对象。这一点和OOP语言是一样
object(Person)[2] public 'name' => string 'test2' (length=5)
object(Person)[2] public 'name' => string 'test2' (length=5)
可见对象的ID号是一个
如果想得到一个对象的副本,用$obj2 =clone $obj1; 用了clone后会产生一个新对象,分配内存,独立于原来的obj1
参见手册此页 http://www.php.net/manual/zh/language.oop5.cloning.php
$obj2 = $obj1; $obj2 = &$obj1;
一样的效果,一样的解释?
对于object来说,是一样的。 对于普通的变量是不一样的。
$a = 1; $b = $a; $c = &$a;
不一样的
以上がPHP オブジェクト指向 (OOP) でオブジェクトをインスタンス化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。