Rumah > pembangunan bahagian belakang > tutorial php > 深入了解PHP面向对象、模式与实践-高级特性(一)

深入了解PHP面向对象、模式与实践-高级特性(一)

黄舟
Lepaskan: 2023-03-06 19:18:02
asal
1478 orang telah melayarinya

静态方法和属性

我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们。这样的方法和属性是“静态的”(static),必须用static关键字来声明。

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

静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。如果修改了一个静态属性,那么这个类的所有实例都能访问到这个新值。访问静态元素时使用::来连接类名和属性或类名和方法。要从当前类中访问静态方法或属性,可以使用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 )
Salin selepas log masuk

下面构建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;    
   }    
   //...
Salin selepas log masuk

只要有一个有效的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);
Salin selepas log masuk

这样的方法就像“工厂”一样,可以接受原始数据(比如一列数据或配置信息),然后根据此产生对象。

PHP5可以在类中定义常量属性,常量属性用const关键字来声明。常量不像常规属性那样以美元符号开头。按照惯例,只能用大写字母来命名常量。常量属性只能包含基本数据类型,只能通过类访问常量属性。

class ShopProduct{    
const AVAILABLE    = 0;    
const OUT_OF_STOCK = 1;    
//...}print ShopProduct::AVAILABLE;
Salin selepas log masuk

Atas ialah kandungan terperinci 深入了解PHP面向对象、模式与实践-高级特性(一). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan