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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值