1. 程式人生 > >PHP-類與物件(-)

PHP-類與物件(-)

  今天介紹PHP的類與物件。類與物件的概念是在程式設計進行到C++時代的時候開始流行的吧。估計到了JAVA就已經就已經是必須掌握的內容了。做為一個程式設計人,不知道類與物件就不是真正的猴子。不深入掌握,當然也算不上真正的程式設計師猿。在PHP中,類與物件和其他程式語言中的規範應該是沒有多少差別的,但一些小的細節要留意。

我一直對中文的這個物件概念有意見,因為程式設計來自西方英語世界,在他們那裡是叫做OBJECT的。這個英文詞當然容易幫助學習程式設計的深刻理解這個概念。所以,在下面的文中,我會時不時用OBJECT來介紹物件的事情。
A class is an OOP (Object Oriented Programming concept, and PHP is both a procedural and OOP friendly language. 這句話的大體意思是:class 我們翻譯成“類”,是面向物件程式設計的概念,PHP既是面向過程的語言也是面向物件的語言。
還是先舉例後說明吧,因為凡是看此文的一定是有一定程式設計基礎的。看圖後解釋:
在這裡插入圖片描述


在這裡插入圖片描述
首先發現了一個問題,在PHP7動態網站開發案例課堂第2版中,205頁,它寫到類的宣告格式如下:
<?php
許可權修飾符 class 類名 {
類的內容;
}
?>
但我在例子中加上許可權修飾符的public的話,它就報錯。在PHP手冊中的英文卻是:
Basic class definitions begin with the keyword class, followed by a class name, followed by a pair of curly braces which enclose the definitions of the properties and methods belonging to the class.
這個地方請高人指點,因為JAVA等的類前面可以加上PUBLIC等的。
初學者可以暫時不管這個,我們解釋程式碼 class 後面是類的名稱,跟function後面是函式名是一個道理,一般小寫。類名後面沒有()但函式有。類名後面是大括號,大括號裡面有兩個類的成員屬性,好好彆扭呀。並且不同的書上會有不同的叫法,比如,欄位,特徵等不一而足。其實我們可以直接理解成類裡面的變數,其實就是變數,為什麼又叫成員屬性,還有將要提到的成員方法呢?是因為除了他們還有類屬性和類方法。這兩種有什麼區別呢,簡單的說, 成員屬性,成員方法是隸屬於用類造成的物件的(object)的,而類屬性類成員是類自身的。記住,類的這些屬性方法是用static來定義的,也叫靜態屬性,靜態方法。物件是不能夠訪問的。並且初學者可以不管類的屬性和方法,只注意成員屬性和成員方法即可。
再往下看程式碼,function的這個叫方法,其實就是函式,只不過在類裡面就換了馬甲和名字。格式和函式是一模一樣的。方法裡面有一個很怪的東西叫 t
h i s
P H P this。這個叫什麼是人們設計的,當然,現在PHP裡面只能這麼叫了。它是代表將要在類外面例項化(製造物件)的物件變數的替代。比如下面的
one,就是物件,這個類裡面的 t h i s &gt; this就是代表他的,如果製造的更多的物件,他就代表更多的物件。當然只是在類裡面代表,否則如何實現物件通過-&gt;這個符號訪問屬性和方法呢。 this->name = n a m e n a m e ) n e w , v a r d u m p ( ) o b j e c t ( S t u d e n t ) 2 N U L L N U L L s t r i n g 12 g e t N a m e e c h o &gt; , name 是屬性(變數)name將其值賦給物件屬性(成員屬性)的。如果你認為類就是模板,可以生產好多的物件,那麼物件就是類的成員的了,成員屬性,成員方法就理解了。 製造物件時,用的程式碼是先用new, 後面跟著一個和類名字相同的函式,這裡也就方法,叫構造方法,這個在這裡例子裡面是預設的,是沒有顯示的。下一個例子你就會理解更深。因為構造方法是沒有引數的,所以僅僅一個括號跟著後面。如果是類名的話,類後面是沒有括號的。所以這個是方法,本質是函式,不是類名。 我們再看第二張圖,通過var_dump()內建函式,我們可以看到變數的結構。這個變數屬於物件變數,所以前面有object(Student)的字樣。這個物件變數指向了一個包含2個元素的陣列。看到NULL了吧,在製造物件時,物件的名字屬性和年齡屬性沒有設定,所以是NULL。而第三行是我們賦值了以後的物件變數的結構,裡面就是名字是string(12)了吧。仔細觀察。中間一行就是通過getName方法取得的名字顯示效果。注意,是需要echo列印的,並且用物件變數,然後-&gt;指向變數名字,沒有