php類與對象 屬性,方法,構造


面向對象基礎

思考:按照面向對象編程思想,先編寫好對應的功能函數,然后再放到某個主體中,那么已經寫好的函數如何放到某個主體中去呢?

面向對象關鍵字掌握:

  定義:面共享對象關鍵字說明,即在面向對象西鄉設計的程序中,有一些關鍵的結構用詞,在面向對象中,關鍵結構包括以下幾個:

  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.構造方法可以當作普通方法由對象調用(不建議)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM