面向對象基礎
思考:按照面向對象編程思想,先編寫好對應的功能函數,然后再放到某個主體中,那么已經寫好的函數如何放到某個主體中去呢?
面向對象關鍵字掌握:
定義:面共享對象關鍵字說明,即在面向對象西鄉設計的程序中,有一些關鍵的結構用詞,在面向對象中,關鍵結構包括以下幾個:
1.類:class,是定義面向對象主體最外層結構,也是用來包裹主體數據和功能(函數),類是一類具有共性事務的代表,代表的是事務的共性。
2.對象:object,是某類事務的具體代表,也是實際數據和功能操作的具體單元,也被稱為實例(instance)。
3.實例化:new,從一個抽象的概念得到一個符合抽象概念的具體實例過程。
4.類成員:member,指類class結構中的所有內容,類成員里有三種;
方法:method,本質是在類class結構中創建的函數,也稱為成員方法,或者成員函數。
屬性:property,本質是在類class結構中創建的變量,也稱為成員變量。
類常量:constant,本質是在類class在結構中創建的常量。
<?php //使用class關鍵字 定義類 class Myclass{ //定義類的屬性,前面必須要加訪問修飾符 public $name='杜威'; //定義類的函數(方法),前面可以省略訪問修飾符,默認是public public function show(){ //在方法中向訪問屬性,可以使用$this。 echo $this->name; //也可以使用這種 // $mynme=new Myclass(); // echo $mynme->name; } } //使用new關鍵字實例化類Myclass,下面兩種方法都是可以的, //由於實例化對象沒有保存,所以輸出的時候都會顯示 object (Myclass)[1] // new Myclass; // new Myclass(); $sb=new Myclass(); $sb->show(); //輸出杜威 ?>
訪問修飾符
定義:訪問修飾符,是一種用在屬性或這方法前的修飾關鍵字,是用來控制屬性或者方法的訪問位置的,在php中訪問修飾符分為三種:public private和protected
1.首先需要明白一組概念類的內部和外部。
類內部:是指類定義的內容內部,即類名后{}內部。
類外部:是指類定義的外部內容,即類名后{}之外的所有地方。
類成員的訪問權限控制是內部訪問(私有的)。鏈內部訪問(受保護)和全部訪問(公有)。
public:公有,及表示所修飾的內容,(屬性或者方法)可以在當前類的內部訪問,也可以在類的外部訪問。
<?php class Myclass{ public $name='duwei'; //內部和外部都可以訪問 } $ff=new Myclass(); echo $ff->name; //正常訪問 輸出duwei ?>
protected:受保護的,即表示所修飾的內容只能在類的內部訪問(到繼承的時候在詳細描述)
<?php class Myclass{ protected $name='duwei'; } $ff=new Myclass(); echo $ff->name; //錯誤 受保護的不允許在類的外部訪問。 ?>
private:私有,即表示所修飾的內容只能在當前類的內部訪問。
<?php class Myclass{ private $name='duwei'; //私有 } $ff=new Myclass(); echo $ff->name; //錯誤 私有屬性,不能在當前類外部訪問。 ?>
<?php class Myclass{ private $name='duwei'; //私有 //我們可以通過方法來引用name屬性 public function showName(){ echo $this->name; } } $ff=new Myclass(); echo $ff->showName(); ?>
類內部對象$this和內存原理
定義:類成員屬性和方法的訪問必須通過對象才能訪問,類外部可以通過實例化得到類對象從而實現成員訪問,但是類內部不能訪問類外部的對象(未知),此時類的內部就內置了一個對象$this
代表來訪問對象
<?php class Myclass{ public $name='duwei'; public $age=32; public function showName(){ // echo $name.$age; //全部錯誤,提示定義變量 //類中的屬性必須要以對象的形式來調用。 // global $ff; //把外面的對象ff 引入進來使用 // echo $ff->name,$ff->sge; //使用$this類內部對象引用 echo $this->name,$this->age; } } $ff=new Myclass(); echo $ff->showName(); ?>
思考這樣一個問題,類一開始就定義好,但是對象實例化是在需要使用該類的時候來調用的,如何保證外部保存對象的變量一定是$ff呢?,對象可以創建多個,如果有多個對象變量,那內部怎么實現呢?
如果系統內部能夠檢測到是哪個對象在調用方法,並且能夠復制對應對象就好了,這個就是類成員方法內置對象$this
$this class和new之間的關系原理
class是定義類結構,屬於非執行段代碼,因此會被加載到代碼段(編譯階段)。
new是實例化對象,先判斷類在內存(代碼段)是否存在
類不存在,報錯
類存在,將類內部的屬性部分復制一份,然后在內存(堆區)開辟一塊內存空間,將屬性放到里面,同時內部有一個指針指向類的內存空間(代碼段)。
對象訪問屬性即訪問的是對象空間存儲的部分。
$this是系統在方法內置的對象通用名字
對象在調用方法的時候,系統會自動找到對象所保存的內存地址(堆區),然后把地址復制給$this
方法內部的$this就代表調用當前$this所在方法的外部對象
$this的本質是函數內部的一個局部變量,只是系統自動對其進行賦值,而且一定是調用方法的對象本身。
構造函數(__construct())
構造方法__construct() 是一種類結構特殊方法,該方法由系統規定好,開發人員定義的時候只需要抄寫一遍,有了構造方法的類在實例化對象之后,對象就會自動調用
1.構造方法實現;在類中增加一個__construct方法即可
<?php class student{ public $name="duwei"; private $age; function __construct() { echo $this->name; } } new student(); //輸出duwei ?>
構造方法也是一個普通的方法,不普通的地方在於,類實例化得到的對象會馬上自動調用。
構造方法的意義:構造方法是對象實例化的時候用來初始化對象的資源的,所以通常用來初始化對象的屬性或者其他資源的初始化。
<?php class student{ //屬性 public $name; private $age; public $sex; function __construct($name,$age,$sex) {
//寫死
//$this->name='杜偉'; //初始化屬性 $this->name=$name; $this->age=$age; $this->sex=$sex; } function show(){ echo $this->name,$this->age,$this->sex; } } //實例化 $obj=new student('杜偉',38,'男'); $obj->show(); ?>
如果屬性的數據在構造函數中初始化時固定寫死的,那么與直接在定義類的時候初始化屬性是一樣的,意味着數據沒有任何價值(所有對象都相同),因此是通過構造函數的參數來實現數據的外部導入。
一旦構造方法擁有的參數,那么對象在調用該方法的時候就需要傳入對應的實參,而構造方法又是自動調用的,所以需要在實例化對象的時候使用new類名(構造方法對應的實參列表)來實現
<?php class student{ //屬性 public $name; private $age; public $sex; function __construct($name,$age,$sex) { //初始化屬性 $this->name=$name; $this->age=$age; $this->sex=$sex; } function show(){ echo $this->name,$this->age,$this->sex; } } //實例化 $obj=new student('杜偉',38,'男'); $obj->show(); //實例化wangy $wangy=new student("王玥",33,"女"); $wangy->show(); ?>
注意:之前所說的new 類名和new 類名() 沒有區別是因為沒有構造方法,或者構造方法沒有參數限定,一旦構造函數方法有了參數,那么new類名 就不能直接使用了
構造方法不管在怎么特殊,也是用戶定義的方法,言外之意除了在實例化對象時對象會自動調用之外,我們也可以手動調用構造方法(但是一般沒有價值,因為對象實例化時會自動調用)
//實例化 $obj=new student('杜偉',38,'男'); $obj->show(); //實例化wangy $wangy=new student("王玥",33,"女"); $wangy->show(); $wangy->__construct("xia",36,"女"); //沒有意義
總結
1.構造方法__construct()是一種系統內置的方法,該方法的特性是會在對象實例化之后,自動調用
2.構造方法的目的就是初始化資源,包含對象屬性和其他資源
3.一旦構造方法定義好之后,且構造方法自帶參數,那么就只能使用new 類名(參數列表)方式才能正確實例化
4.構造方法可以當作普通方法由對象調用(不建議)。