静态方法和属性
我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们。这样的方法和属性是“静态的”(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面向对象、模式与实践-高级特性(一)的详细内容。