php中靜態方法的使用

來源:互聯網
上載者:User

標籤:訪問   產生   成員變數   count()   ted   png   覆蓋   idt   strong   

靜態方法

(1)靜態方法不能訪問這個類中的普通屬性,因為那些屬性屬於一個對象,但可以訪問靜態屬性;

(2)從當前類(不是子類)中訪問靜態方法或屬性,可以使用 self 關鍵字,self 指向當前類,就像 $this  指向當前對象一樣;

(3)不能再對象中調用靜態方法,靜態方法和屬性又被稱為類方法和類屬性,因此不能再對象中使用偽變數 $this 。

靜態方法的優點:

(1)在代碼的任何地方都可以用(假設可以訪問該類);

(2)類的每個執行個體都可以訪問類中定義的靜態屬性,可以利用靜態屬性來設定值,該值可以被類的所有對象使用;

(3)不需要執行個體對象就能訪問靜態屬性或方法。

<?php$pdo = new PDO(‘mysql:host=localhost;dbname=mydb‘,‘root‘);  // 產生一個 PDO(PHP Data Object) 對象class ShopProduct{    private $title;             // 屬性也稱為成員變數,用來存放對象之間互不相同的資料    private $producerMainName;  // 所有的屬性都設定為 private,不允許外部直接存取這些屬性,然後提供方法來取得需要的值    private $producerFirstName;    protected $price;           // 阻止外面直接存取該屬性,可以被子類訪問    private $discount = 0;    private $id = 0;    // 建立對象時,構造方法會被自動調用,構造方法可以確保必要的屬性設定,並完成任何需要準備的工作    public function __construct($title,$mainName,$firstName,$price){        $this->title = $title;      // 使用偽變數$this給每個變數賦值        $this->producerMainName = $mainName;        $this->producerFirstName = $firstName;        $this->price = $price;    }    /**     * @return mixed 這種只返回屬性值的方法稱為“存取方法”,也稱為 getter 和 setter     */    public function getProducerFirstName()    {        return $this->producerFirstName;    }    /**     * @return mixed 擷取 姓 的存取方法     */    public function getProducerMainName()    {        return $this->producerMainName;    }    /**     * @param $num 打折的價格     */    public function setDiscount($num)    {        $this->discount = $num;    }    /**     * @return int 折扣的存取方法     */    public function getDiscount()    {        return $this->discount;    }    /**     * @return mixed Book名或CD名的存取方法     */    public function getTitle()    {        return $this->title;    }    /**     * @return mixed 折扣後的價格     */    public function getPrice()    {        return ($this->price - $this->discount);    }    /**     * @return string 作者     */    public function getProducer(){  // 方法讓對象執行任務        return $this->producerMainName .‘ ‘. $this->producerFirstName;    }    /**     * @return string 發票的摘要資訊     */    public function getSummaryLine()    {        $base = "{$this->title} ( {$this->producerMainName},{$this->producerFirstName}) ";        return $base;    }    /**     * @param $id id 的存取方法, setter     */    public function setId($id)    {        $this->id = $id;    }    // 根據查詢資料的資料類型,返回特定類型的 ShopProduct 對象,這個方法沒有使用任何執行個體的屬性和方法,因此把它定義為一個靜態方法(static),只要有一個有效 PDO 對象,就可以在程式的任何地方調用這個方法。這個方法就像工廠一樣,可以接受未經處理資料產生特定類型的對象。    public static function getInstance($id,PDO $pdo)    {        $stmt = $pdo -> prepare("SELECT * FROM products WHERE id=?");        $stmt -> execute(array($id));        $row = $stmt -> fetch();        if(empty($row)){            return null;        }        switch($row[‘type‘])        {            case ‘book‘ :                $product = new BookProduct($row[‘title‘],$row[‘first_name‘],$row[‘main_name‘],$row[‘price‘],$row[‘num_pages‘]);            break;            case ‘cd‘ :                $product = new CdProduct($row[‘title‘],$row[‘first_name‘],$row[‘main_name‘],$row[‘price‘],$row[‘play_length‘]);            break;            default :                $product = new ShopProduct($row[‘title‘],$row[‘first_name‘],$row[‘main_name‘],$row[‘price‘]);            break;        }        $product -> setId($row[‘id‘]);        $product -> setDiscount($row[‘discount‘]);        return $product;    }}// 若衍生類別沒有定義構造方法,則它在執行個體化是會自動調用父類的構造方法。子類預設繼承父類所有的 public 和 protected 方法,但不繼承 private 方法和屬性class BookProduct extends ShopProduct{    private $numPages;    // 每個子類在設定自己的屬性前調用父類的構造方法,基類現在僅知道自己的資料,子類一般是父類的特列,應該避免告訴父類任何關於子類的訊息。    public function __construct($title,$mainName,$firstName,$price,$numPages)    {        // parent 關鍵字可以在任何複寫父類方法的方法中使用,通過在當前對象中調用父類的方法來拓展父類的功能 , 要應用一個類而不是對象的方法,使用 :: 而不是 ->        parent::__construct($title,$mainName,$firstName,$price);        $this -> numPages = $numPages;    }    /**     * @param $numPages 書的頁數     * @return mixed    總頁數     */    public function getNumberOfPages()    {        return $this->numPages;    }    /**     *  子類(衍生類別)可以覆蓋和修改父類(基類或超類)的功能     * @return string Book發票的摘要資訊     */    public function getSummaryLine()    {        $base = parent::getSummaryLine();        $base .= "page count - {$this->numPages}";        return $base;    }}class CdProduct extends ShopProduct{    private $playLength;    public function __construct($title,$mainName,$firstName,$price,$playLength)    {        parent::__construct($title,$mainName,$firstName,$price);        $this -> playLength = $playLength;    }    /**     * @return int 播放時間     */    public function getPlayLength()    {        return $this -> playLength;    }    /**     * @return string CD發票的摘要資訊     */    public function getSummaryLine()    {        $base = parent::getSummaryLine();        $base .= "playing time - {$this->playLength}";        return $base;    }}$product = ShopProduct::getInstance(1,$pdo);     // 該靜態方法根據傳入 id 的不同產生特定類型的對象if($product){    print "author : {$product -> getProducer()} </br>";              // author :Lun Xun    print "summary line: {$product -> getSummaryLine()}</br>";      // summary line: Kong Yiji ( Xun,Lun) page count - 200}

 附(sql 檔案 和 資料的圖片):

本文是我閱讀了《深入PHP 物件導向、模式與實踐》一書的第四章中關於靜態方法和屬性的部分後所作

如有轉載,請註明出處:http://www.cnblogs.com/chrdai/p/6863090.html

 

php中靜態方法的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.