php中靜態方法的屬性有哪些

2020-07-16 10:06:31

php中靜態方法的屬性:

(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
}
以上就是php中靜態方法的屬性有哪些的詳細內容,更多請關注TW511.COM其它相關文章!