對象與類

在前面代碼(兩篇博客)中定義了一個類,並創建了這個類的對象,把前面產生的對象作爲這個新對象的一個熟悉,完整代碼如下:

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類就會收留這個對象)。
理解了以上四個概念,集合現實世界從實現和存儲理解對象和類,這樣就不會把二者看成一個抽象、神祕的東西,也就能寫出符合現實世界的類了。

如果需要一個類,要從客觀世界抽象出一套規則,就得總結這類事物的共性,並且讓它可以與其他類進行區分。而這個區分的依據就是屬性和方法。區分的辦法就是實例化出一個對象,是騾子是馬,拉出來溜溜。

現在,你是否對“白馬非馬”這個典故有了新的認識?

發佈了58 篇原創文章 · 獲贊 54 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章