首頁  >  文章  >  後端開發  >  深入了解PHP物件導向、模式與實務-高階特性(一)

深入了解PHP物件導向、模式與實務-高階特性(一)

黄舟
黄舟原創
2017-03-20 09:51:421399瀏覽

靜態方法和屬性

我們不僅可以透過物件存取方法和屬性,還可以透過類別來存取它們。這樣的方法和屬性是「靜態的」(static),必須用static關鍵字來宣告。

class StaticExample{    
static public $aNum=0;    
static public function sayHello()    
{        
self::$aNum++;        
print "hello (".self::$aNum.")/n";    
}
}
print StaticExample::$aNum;StaticExample::sayHello();

靜態方法是以類別作為作用域的函數。靜態方法不能存取這個類別中的普通屬性,因為那些屬性屬於一個對象,但可以存取靜態屬性。如果修改了一個靜態屬性,那麼這個類別的所有實例都能存取到這個新值。存取靜態元素時使用::來連接類別名稱和屬性或類別名稱和方法。要從目前類別中存取靜態方法或屬性,可以使用self關鍵字。 self指向當前類別,就像偽變數$this指向當前物件一樣。根據定義,我們不能在物件中呼叫靜態方法,因此靜態方法和屬性又被稱為類別變數和屬性,因此不能在靜態方法中使用偽變數。

下面建構ShopProduct類別的一個靜態方法來自動實例化ShopProduct物件。使用sqlite定義表格products,如下所示:

CREATE TABLE products(    
id INTEGER PRIMARY KEY AUTOINCREMENT,    
type TEXT,    
firstname TEXT,    
mainname TEXT,    
title TEXT,    
price float,    
numpages int,    
playlength int,    
discount int )

下面建構getInstance()方法,其參數為資料庫記錄的id和pdo物件。用它們取得資料庫的一行記錄,然後傳回ShopProduct物件。

//ShopProduct类, 
private $id = 0;    
//...    
public function setID($id)    
{        
$this->$id;    
}    
//...   
 public static function getInstance($id, PDO $pdo)    
 {        
 $stmt   = $pdo->prepare("select * from products where id=?");        
 $result = $stmt->execute(array($id));        
 $row    = $stmt->fetch();        
 if (empty($row)) {            
 return null;        
 }        
 if ($row['type'] == "book") {            
 $product = new BookProduct(                
 $row['title'],                
 $row['firstname'],                
 $row['mainname'],                
 $row['price'],                
 $row['numpages']            
 );       
  } else if ($row['type'] == "cd") {            
  $product = new CdProduct(                
  $row['title'],                
  $row['firstname'],                
  $row['mainname'],                
  $row['price'],                
  $row['playlength']            
  );        
  } else {            
  $product = new ShopProduct(                
  $row['title'],                
  $row['firstname'],                
  $row['mainname'],                
  $row['price']            
  );        
  }        
  $product->setID($row['id']);        
  $producerMainName->setDiscount($row['discount']);       
   return $product;    
   }    
   //...

只要有一個有效的PDO對象,我們就可以在程式的任何地方呼叫這個方法:

$dsn = "sqlite://home/bob/projects/products.db";$pdo = new PDO($dsn, null, null);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$obj = ShopProduct::getInstance(1, $pdo);

這樣的方法就像「工廠」一樣,可以接受原始資料(例如一列資料或配置資訊),然後根據此產生物件。

PHP5可以在類別中定義常數屬性,常數屬性用const關鍵字來宣告。常量不像常規屬性那樣以美元符號開頭。按照慣例,只能用大寫字母來命名常數。常量屬性只能包含基本資料型別,只能透過類別存取常數屬性。

class ShopProduct{    
const AVAILABLE    = 0;    
const OUT_OF_STOCK = 1;    
//...}print ShopProduct::AVAILABLE;

以上是深入了解PHP物件導向、模式與實務-高階特性(一)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn