1.如何定义(抽象)一个类
类的基本结构如下:
class Person{ }复制代码
1.面向对象的思想
面向对象(ObjectOriented,OO)
是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
2.面向对象的语法
1.成员属性
- 即变量
- 常用修饰符
public(公有)
private(私有)
protected(受保护)
static
- 4种标量
string
int
Boolean
float
- 定义成员属性,不可以有表达式!!!
public $name = '小明'; protected $age = 18; private $money = 100;复制代码
2.成员方法
- 即函数
- 常用修饰符
public(公有)
private(私有)
protected(受保护)
static
abstrsct(抽象)
final(最终)
public function show(){ return $this->name; }复制代码
3.类的实例化
class Person{ public $name = '小明'; protected $age = 18; private $money = 100; public function show(){ return $this->name; }}$Person = new Person(); //实例化一个类复制代码
3.魔术方法
魔术方法 | 说明 |
---|---|
__construct(, | 类的构造函数 |
__destruct() | 类的析构函数 |
__call() | 在对象中调用一个不可访问方法时调用 |
__callStatic() | 用静态方式中调用一个不可访问方法时调用 |
__get() | 获得一个类的成员变量时调用 |
__set() | 设置一个类的成员变量时调用 |
__isset() | 当对不可访问属性调用isset()或empty()时调用 |
__unset() | 当对不可访问属性调用unset()时被调用。 |
__sleep() | 执行serialize()时,先会调用这个函数 |
__wakeup() | 执行unserialize()时,先会调用这个函数 |
__toString() | 类被当成字符串时的回应方法 |
__invoke() | 调用函数的方式调用一个对象时的回应方法 |
__set_state() | 调用var_export()导出类时,此静态方法会被调用。 |
__clone() | 当对象复制完成时调用 |
__autoload() | 尝试加载未定义的类 |
__debugInfo() | 打印所需调试信息 |
使用方法如下:
class Magic{ public $var = 'test'; //构造函数,在创建对象的时候调用 public function __construct(){ echo '__construct called'.PHP_EOL; } //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用 public function __destruct(){ echo '__destruct called'.PHP_EOL; } //当给不可访问或不存在属性赋值时被调用 public function __set($name, $value){ echo $name.'-'.$value; echo '__set called'.PHP_EOL; } //读取不可访问或不存在属性时被调用 public function __get($name){ echo $name; echo '__get called'.PHP_EOL; } //调用不可访问或不存在的方法时被调用 public function __call($name, $arguments){ echo $name . '-' . implode(',', $arguments); echo '__call called'.PHP_EOL; } //调用不可访问或不存在的静态方法时被调用 public static function __callStatic($name, $arguments){ echo $name . '-' . implode(',', $arguments); echo '__callStatic called'.PHP_EOL; } //对不可访问或不存在的属性调用isset()或empty()时被调用 public function __isset($name){ echo $name; echo '__isset called'.PHP_EOL; return true; } //对不可访问或不存在的属性进行unset时被调用 public function __unset($name){ echo $name; echo '__unset called'.PHP_EOL; } //serialize时被调用,当你不需要保存大对象的所有数据时很有用 public function __sleep(){ echo '__sleep called'.PHP_EOL; return array('var1111111111'); } //unserialize时被调用,可用于做些对象的初始化操作 public function __wakeup(){ echo '__wakeup called'.PHP_EOL; $this->var = 'test after wakeup'; } //当一个类被转换成字符串时被调用 public function __toString(){ return '__toString called'.PHP_EOL; } //进行对象clone时被调用,用来调整对象的克隆行为 public function __clone(){ echo '__clone called'.PHP_EOL; } //当以函数方式调用对象时被调用 public function __invoke(){ echo '__invoke called'.PHP_EOL; } //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。 public static function __set_state($arr){ return '__set_state called'.PHP_EOL; } //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 public function __debuginfo($arr){ echo '__debuginfo called'.PHP_EOL; return array('var' => 'test fro __debuginfo'); }} $m = new Magic(); //__construct()被调用$m->not_exist_property = test; //__set()被调用echo $m->not_exist_property;//__get()被调用$m->abc(1,2,3); //__call()被调用echo isset($m->not_exist_property); //__isset()被调用,返回bool值unset($m->not_exist_property);//__unset()被调用echo $tmp = serialize($m); //__sleep()被调用unserialize($tmp);//__wakeup()被调用$m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制$m(); //__invoke()eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2);var_dump($m);//最后__destruct()被调用复制代码
结果:
__construct callednot_exist_property-test__set callednot_exist_property__get calledabc-1,2,3__call callednot_exist_property__isset called1not_exist_property__unset called__sleep calledO:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called__destruct called__clone called__invoke calledstring(20) "__set_state called"class Magic#1 (1) { public $var => string(4) "test"}__destruct called__destruct called复制代码