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

黄舟
黄舟 原创
2023-03-06 19:18:02 911浏览

静态方法和属性

我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们。这样的方法和属性是“静态的”(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核实处理。