<?php /* PHP 面向对象化程序设计 PHP5 开始引入面向对象的所有机制 数组和对象都属于复合类型(一个变量可以存储多个单元或元素) 对象的三大特性:封装、继承、多态 对象包含属性和方法 描述对象的结构就是类 类包含成员属性和成员方法 定义好了类,就相当于有了对象生产的工厂,将类实例化就是一个对象 封装属性和方法 public - 完全公开访问 private - 只在类中才能访问 protected - 只有在类中和继承的子对象中才能访问 魔术方法 __set() __get() __isset() __unset() 常用关键字 final 1、不能修饰成员属性 2、只能修饰类和方法 作用: 使用final修饰的类不能被子类继承 使用findal修饰的方法不能被子类去覆盖 static 1、修饰成员属性和成员方法,不能修饰类 2、所修饰的成员属性和方法可以被类的所有实例共享 3、静态数据不存在于任何一个类中,而存在于内在中的初始化静态区域中 4、在类在第一次使用时,不仅仅是实例化,创建静态数据 5、调用方法: 类名::静态成员,不要用实例化后的对象名访问 6、类的内部使用静态成员,使用self::静态成员 来调用 const 1、只能修饰成员属性 2、在类中声明常量使用此关键字 3、访问方式和静态成员属性相同 类外使用 类名::常量名 ,类中使用 self::常量名 4、必须在声明时就赋值 常用方法 __call() 1、调用成员方法时,如果不存在此方法则会出错,程序将中止 2、如果有此方法,则在此时会调用__call()而不会导致程序中止 __toString() 1、直接输出对象时会报错,加入此方法并返回一个字符串 __autoload __clone */ class person { private $name; private $age; private $high; static $instance; const AUTHOR = '我是作者'; private function __construct($name='mike', $age=21, $high=1.76) { // 构造函数 $this->name = $name; $this->age = $age; $this->high = $high; // 如果将此行注释,__isset将返回false echo '构造函数!<br>'; } function __destruct() { // 析构函数 // 释放类中所使用的变量及资源占用 } static function getInstance() { if(!isset(self::$instance)) { self::$instance = new self(); } return self::$instance; } private function __get($var) { return $this->$var; } private function __set($var, $value) { $this->$var = $value; } private function __isset($var) { $r = isset($this->$var); echo var_dump($r)."<br>"; return isset($this->$var); // 注意:当私有成员 $this->$var 未赋值或者未初始化时,也会返回 false } function __call($method, $args) { echo "$method("; print_r($args); echo ") 方法不存在!<br>"; } function __tostring() { return get_class($this); // __CLASS__ } } $p = person::getInstance(); echo "名字:{$p->name}<br>"; if(isset($p->high)) echo "身高值存在!<br>"; else echo "身高值不存在!<br>"; // 此时person::$instance和$p是同一个对象,实现单例 echo var_dump(person::$instance)."<br>"; // 此时 $p2 和 $p1也指向同一个对象 $p2 = person::getInstance(); echo var_dump(person::AUTHOR)."<br>"; // 调用不存在的方法 $p2->gohome('my home'); // 直接输出对象时,如果没有 __toString() 就会出系统错误 echo "$p2<br>"; echo "-------------------------<br>"; class pp { var $name = '小名'; // 调用clone()方法时会调用此方法,主要目的是为克隆出的对象进行初始化 function __clone() { // 此方法中 $this 代表复本对象 // 用$that代表本对象 $this->name = '新名字'; } } $pp = new pp(); $pp2 = clone $pp; echo $pp->name."<br>"; echo $pp2->name."<br>"; // 动态包含:必须放在类外部 // 可将此方法写到一个INC文件中进行加载,然后扩充 // 达到可以在任何文件中自由使用需要包含的类文件 // 可以用条件语句对加载进行灵活处理 function __autoload($className) { include './$className'; } ?>