static 关键字 -- 定义静态变量或方法
static关键字表示静态的意思,用于修饰类的成员属性和成员方法(即静态属性和静态方法)。
类中的静态属性和方法不用实例化(new)就可以直接使用类名访问。
格式: 类::$静态属性 类::静态方法
在类的方法中。不能this来引用静态变量或静态方法,而需要用self来引用。
格式: self::$静态属性 self::静态方法
静态方法中不可以使用非静态的内容。就是不让使用$this。
静态属性是共享的。也就是new很多对象也是共用一个属性。
class person{ static public $name = 'xiaoming'; public $age = 20; static public function say(){ echo '我的名字是'.self::$name.'<br>'; } public function action1(){ echo '不实例化就能访问'.self::$name.'<br>'; } /* 静态方法里面不能调用非静态变量 $this static public function action2(){ echo '我叫'.self::$name.'今年'.$this->age.'岁<br>'; } */ public function action3(){ echo '我叫'.self::$name.'今年'.$this->age.'岁<br>'; } } echo person::$name.'<br>'; //静态属性可以直接调用,不需要实例化 person::say(); //静态方法也可以直接调用,不需要实例化 person::action1(); //只含有静态属性的非静态方法也可以直接调用 //person::$age; //无法访问,这方法只能用来访问静态变量 //person::action3(); //无法访问,含有$this需要实例化才可以访问 $p = new person(); $p->action3(); //正常输出 class user{ static private $count = 0; public function __construct(){ self::$count = self::$count + 1; } public function getcount(){ return self::$count; } public function __destruct(){ self::$count = self::$count - 1; } } $u1 = new user(); $u2 = new user(); $u3 = new user(); echo '销毁之前调用数量'.$u1->getcount().'<br>'; unset($u3); //销毁u3时调用其析构方法,减少静态变量的数量 echo '销毁之后调用数量'.$u1->getcount().'<br>';
const 关键字 -- 定义常量
const 是一个在类中定义常量的关键字,我们都知道在PHP中定义常量使用的是”define()”这个函数,但是在类里面定义常量使用的是”const”这个关键字
语法:
const CONSTANT = ‘constant value’; //定义
echo self::CONSTANT; //类内部访问
echo className::CONSTANT; //类外部访问
注意事项:
1.在定义时必须被初始值,
2.前面不加任何修饰符
3.变量名字母一般都大写
4.常量可以被子类继承
5.一个常量是属于一个类的,而不是某个对象的
用法一:const用于类成员变量,一经定义不可修改,define用于全局常量,不可用于类成员变量的定义,const可在类中使用,define不能。
用法二:const定义的常量大小写敏感,而define可通过第三个参数(为TRUE表示大小写不敏感)来指定大小写是否敏感。在运行时定义一个常量。define('TXE',100,TRUE);
用法三:const不能在条件语句中定义常量,而define函数可以。if($a>10){define('LE','hello');}
class person1{ const CN = 'China'; public function say(){ echo 'I am from '.self::CN; } } echo person1::CN.'<br>'; person1::say();
instanceof 关键字 -- 检测当前实例是否属于某个类或某个类的子类
Instanceof 关键字用于检测用于检测当前对象实例是否属于某一个类或这个类的子类。
class person2{} class person3 extends person2{} $a = new person2(); $b = new person3(); if($a instanceof person2){ echo '$a是person2的实例<br>'; } if($b instanceof person2){ echo '$b是person2的子类'; }
单例设计模式
单态模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象存在。
单例类:
1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2、拥有一个保存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
另外,需要创建__clone()方法防止对象被复制(克隆)
为什么要使用PHP单例模式?
1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
class danli{ //保存类实例的静态变量 private static $_instance; //私有构造方法,防止直接被实例化 private function __construct(){ echo '私有的构造方法'; } //创建__clone方法防止对象被复制克隆 public function __clone(){ trigger_error('Clone is not allow!',E_USER_ERROR); } public static function getInstance(){ if(!(self::$_instance instanceof self)){ self::$_instance = new self; } return self::$_instance; } public function say(){ echo '调用成功<br>'; } } //由于__construct被私有化保护,直接new会报错 //$c = new danli(); //正确方法,用双冒号::操作符访问静态方法获取实例 $d = danli::getInstance(); $d->say();