类中的成员属性不能够用函数为其赋值。public age = rand(1,100);//这是错误的;
__get() __set() __isset() __unset()
final 用来修饰成员方法或类,被final修饰的类不能被继承,final修饰的方法不能重载。参考博客
const 定义的常量归类所有。类名::常量名 方式访问
statics 成员方法中使用了$this,那么这个成员方法就不能用statics修饰.
parent指向父类,可以访问父类的静态常量、静态属性,不能访问父类的非静态属性,可以调用父类的方法(不能是private方法,无论是否静态)
对象串行化:serialize() 默认情况是把整个对象串行化,准确说是对象里的属性,如果我只想串行化指定的成员属性。那需要使用一个魔术方法 __sleep() ,调用serialize时触发。还有一个 __wakeup() 是在调用unserialize() 触发, 作用是在反串行化的时候可以修改成员属性。
__tostring() 使用echo输出对象时触发。验证码类可以使用来简化操作。
克隆:由于把一个对象赋值给另一个变量的时候默认是引用的(不是把值传递给另一个变量)。所以需要clone,才能得到一个新的一样的对象,改变其中一个对象的时候,另一个不会变。如果说克隆的时候想要改变某些属性,需要使用__clone() 在clone的时候触发。
class SubObject { static $instances = 0; public $instance; public function __construct() { $this->instance = ++self::$instances; } public function __clone() { $this->instance = ++self::$instances; } } class MyCloneable { public $object1; public $object2; function __clone() { // 强制复制一份this->object, 否则仍然指向同一个对象 $this->object1 = clone $this->object1; } } $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj->object2 = new SubObject(); $obj2 = clone $obj; echo '<pre>'; print("Original Object: "); print_r($obj); print("Cloned Object: "); print_r($obj2); //手册中的示例
__call() 调用类中不存在的方法时触发。
__autoload()
单例设计模式:
1 <?php 2 3 class Mysql{ 4 static private $link = null; 5 private function __construct(){ 6 echo 1111; 7 } 8 9 static public function connect(){ 10 if(is_null(self::$link)){ 11 self::$link = new self;//new self 是实例化 12 } 13 return self::$link; 14 } 15 } 16 //这样就实现了一个简单的单例设计模式 17 Mysql::connect(); //无论调用多少次这个方法,都只会输出一个