1.如何定义(抽象)一个类
类的基本结构如下:
class Person{
}
1.面向对象的思想
面向对象(ObjectOriented,OO)
是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
2.面向对象的语法
1.成员属性
- 即变量
- 常用修饰符
public(公有)private(私有)protected(受保护)static - 4种标量
stringintBooleanfloat - 定义成员属性,不可以有表达式!!!
public $name = '小明';
protected $age = 18;
private $money = 100;
2.成员方法
- 即函数
- 常用修饰符
public(公有)private(私有)protected(受保护)staticabstrsct(抽象)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 called
not_exist_property-test__set called
not_exist_property__get called
abc-1,2,3__call called
not_exist_property__isset called
1not_exist_property__unset called
__sleep called
O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called
__destruct called
__clone called
__invoke called
string(20) "__set_state called
"
class Magic#1 (1) {
public $var =>
string(4) "test"
}
__destruct called
__destruct called