静态成员,作用域为自身。
使用静态,效率会高。是因为避免了实例化(会占用一小部分系统资源)在使用::$变量 时,变量前要加“$”。是因为php当前不支持动态的静态变量的使用,也就是说,不支持可变的静态变量。
不用$时,访问的是类中的某个常量
class MyObject {
public static $myVariable = 10;
}
echo MyObject::$myVariable;
在PHP中使用作用域限定操作符时,用变量作为类的名称是不允许的。eg: $classnameinvar::somemethod()
单列模式和工厂模式
单列模式被当作职责模式,(是因为它将创建对象的控制权委托到一个单一的访问点上。)它用来在应用程序中创建一个单一的功能访问点。在任何时候,应用程序中都只会有这个类仅有的一个实例存在。
必须拥有:
1. 一个构造函数,且必须被标记为private
2. 一个保存类的实例的静态成员变量
3. 一个访问这个实例的公共的静态方法
单列类不能在其他类中直接实例化。只能被其自身实例化。
class Database {
private $_db;
static $_instance;
private function __construct() {
$this->_db = pg_connect('dbname=example_db');
}
private __clone() {};
public static function getInstance() {
if( ! (self::$_instance instanceof self) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function query($sql) {
//Run a query using $this->_db
return pg_query($this->_db,$sql);
}
}
工厂模式在多态性设计中非常重要。是指包含了一个专门用来创建其他对象的方法的类。
它允许动态地替换类、修改配置,并且
异常
表示由try、catch和throw等语句和Exception类组成的整个处理机制
try 用来定义检测异常的代码块
catch 处理异常时的处理方法 catch ( Exception $e) { }
throw 语句是用来触发异常发生并且在这点上中断处理过程的。必须给它传递一个Exception
#debug_backtrace()
SPL序列化
<?php
error_reporting(E_ALL);
class Base implements Serializable {
private $baseVar;
public function __construct() {
$this->baseVar = 'foo';
}
public function serialize() {
return serialize($this->baseVar);
}
public function unserialize($serialized) {
$this->baseVar = unserialize($serialized);
}
public function printMe() {
echo $this->baseVar . "\n";
}
public function ctest($test){
echo $test;
}
}
class Extender extends Base {
private $extenderVar;
public function __construct() {
parent::__construct();
$this->extenderVar = 'bar';
}
public function serialize() {
$baseSerialized = parent::serialize();
return serialize(array($this->extenderVar, $baseSerialized));
}
public function unserialize( $serialized ) {
$temp = unserialize($serialized);
$this->extenderVar = $temp[0];
parent::unserialize($temp[1]);
}
}
$instance = new Extender();
$serialized = serialize($instance);
echo $serialized . "\n";
$restored = unserialize($serialized);
echo '<hr/>';
$restored->printMe();
$restored->ctest('xxoo');