类中的成员属性不能够用函数为其赋值。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:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);  //手册中的示例
View Code

 

__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(); //无论调用多少次这个方法,都只会输出一个