物件導向程式的單位就是對象,但物件又是透過類別的實例化出來的,既然我們類別會宣告了,下一步就是實例化物件了。下面我們就來跟大家介紹如何實例化物件。
當定義好類別後,我們使用new關鍵字來產生一個物件。
$物件名稱= 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=new Person();
這條程式碼就是透過類別產生實例物件的過程,$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中文網其他相關文章!