深入PHP面向对象、模式与实践——高级特性(1)
来源:互联网 发布:情定三生知夏恢复记忆 编辑:程序博客网 时间:2024/05/15 16:24
静态方法和属性
我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们。这样的方法和属性是“静态的”(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类,见上一篇博客《深入PHP面向对象、模式与实践——对象》 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;
1 0
- 深入PHP面向对象、模式与实践——高级特性(1)
- 深入PHP面向对象、模式与实践——高级特性(2)
- 深入PHP面向对象、模式与实践——高级特性(3)
- 深入PHP面向对象、模式与实践——高级特性(4)
- 深入PHP面向对象、模式与实践——高级特性(5)
- 深入PHP面向对象、模式与实践——高级特性(6)
- 【学习笔记】《深入PHP - 面向对象、模式与实践》(第3版)——第4章 高级特性
- 深入PHP面向对象、模式与实践——对象
- 深入PHP面向对象、模式与实践——对象工具(1)
- 深入PHP面向对象、模式与实践——生成对象(1)
- 深入PHP面向对象、模式与实践——执行及描述任务(1)
- 深入PHP面向对象、模式与实践——对象工具(2)
- 深入PHP面向对象、模式与实践——生成对象(2)
- 深入PHP面向对象、模式与实践——生成对象(3)
- 深入PHP面向对象、模式与实践——模式原则(2)
- 深入PHP面向对象、模式与实践——企业模式(2)
- 深入PHP面向对象、模式与实践——企业模式(3)
- 深入 PHP 面向对象、模式与实践
- Haproxy反向代理MySQL底层原理分析
- Android Studio下自动生成UML图
- 根据手机品牌设置状态栏
- 【译】避免打断链式结构:使用.compose( )操作符、CompositeSubscription
- sql server 存入中文前加N
- 深入PHP面向对象、模式与实践——高级特性(1)
- 银行拆借利率报价
- 多线程中同步异步函数与串行并发队列的组合情况
- Could not obtain transaction-synchronized Session for current thread 报错在spring注解定时任务上的处理
- 数据结构之栈(java版)
- Ubuntu14.04安装mysql-python(MySQL)
- Java中内存分配和回收策略、新生代、老年代
- 题目1007:奥运排序问题
- 记一次JSON到前台乱码的解决方案