在前面代碼(兩篇博客)中定義了一個類,並創建了這個類的對象,把前面產生的對象作爲這個新對象的一個熟悉,完整代碼如下:
class Person
{
public $name;
public $gender;
public function say()
{
echo $this->name,"\tis\t",$this->gender,"\r\n";
}
}
class family
{
public $people;
public $location;
public function __construct($p,$l)
{
$this->people = $p;
$this->location = $l;
}
}
$student = new person();
$student->name = 'Tom';
$student->gender = 'male';
$student->say();
$tom = new family($student,'peking');
echo serialize($student);
$student_arr = ['name'=>'Tom','gender'=>'male'];
echo "\n";
echo serialize($student_arr);
print_r($tom);
echo "\n";
echo serialize($tom);
輸出結果如下:
Tom is
male
O:6:"Person":2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";}
a:2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";}family Object
(
[people] => Person Object
(
[name] => Tom
[gender] => male
)
[location] => peking
)
O:6:"family":2:{s:6:"people";O:6:"Person":2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";}s:8:"location";s:6:"peking";}
可以看出,序列化後的對象會附帶所屬類名,這個類名保證此對象能夠在執行類的方法(也是自己所能執行的方法)時,可以正確地找到方法所在的代碼空間(即對象所擁有的方法存儲在類裏)。另外,當一個對象的實例變量引用其他對象時,序列化該對象時也會對引用對象進行序列化。
基於如上分析,可以總結出對象和類的概念以及二者之間的關係:
- 類是定義一系列屬性和操作的模板,而對象則把屬性進行具體化,然後交給類處理。
- 對象就是數據,對象本身不包含方法。但是對象有一個“指針”指向一個類,這個類裏可以有方法。
- 方法描述不同屬性所導致的不同表現。
- 類和對象是不可分割的,有對象就biubiu有一個類和其對應,否則這個對象也就成了沒有親人的孩子(但有一個特殊情況存在,就是由標量進行強制類型轉換的object,沒有一個類和它對應。此事,PHP中一個稱爲“孤兒”的stdClass類就會收留這個對象)。
如果需要一個類,要從客觀世界抽象出一套規則,就得總結這類事物的共性,並且讓它可以與其他類進行區分。而這個區分的依據就是屬性和方法。區分的辦法就是實例化出一個對象,是騾子是馬,拉出來溜溜。
現在,你是否對“白馬非馬”這個典故有了新的認識?