守得云开见月明 首页 关于

PHP 面向对象

2018-09-12 / Juexe / Web

好东西。

第1章 面向对象基础

一、面向对象介绍

基本原则

项目代码都应该由单个能够起子程序作用的对象组成

三个目标

  1. 重用性。每个模块可重复使用。
  2. 灵活性。每个模块可轻松被替换,如零件一般。
  3. 扩展性。在现有模块上添加新功能也很方便。

二、类和对象

  • 类实例化后即得对象
  • 类属性访问控制

    • public
    • private
    • protected

第2章 面向对象特性及运用

一、构造方法与析构方法

__construct

必须public才可实例化,如为private不可实例化(运用在单例模式中)

__desctruct

PHP脚本结束自动析构,或使用 unset() 析构

二、类的继承

  • 轻松获得扩展性
  • 不可滥用,最好不要超过三层
  • 建议使用对象组合的方法来达到扩展性

三、命名空间

使用 namespace 关键字来分隔不同的类。

四、类的自动加载

在使用未加载的类时会自动调用 __autoload 的魔术方法。但是PHP5.4后已不推荐使用这个方法,取而代之的是一个PHP标准库方法 spl_autoload_register

示例(使用匿名函数):

spl_autoload_register(function($classname){
    require $classname . ".php";
});

五、后期静态绑定

父类存在A和B两个静态方法,而A方法会调用B方法。当子类重写了B静态方法会怎么样呢?两种情况:

public static A(){
    self::B(); // 默认调用自己的B方法
    static::B(); // 静态绑定,调用子类的B方法
}

六、魔术方法

魔术方法备注
__get() 和 __set()在赋值/读取对象的未定义属性时调用
__call() 和 __callStatic()调用对象的方法不存在时调用
__toString()对象被输出(echo)时调用
__invoke()对象被当做函数时调用,如 $obj();

七、对象拷贝和类型约束

1. 浅拷贝(PHP默认浅拷贝对象)

$a = new Obj();
$b = $a;

以上,$b 其实就是 $a 的地址

2. 深拷贝

$a = new Obj();
$b = clone $a;

上面使用 clone 关键字可以进行深拷贝。

但对象的子对象也拷贝了吗?

$a = new Obj1();
$a->obj2 = new Obj2();
$b = clone $a;
$b->obj2=new Obj3();

实际上 $a->obj2 依然受到影响,需使用 __clone 魔术方法对子对象进行拷贝。

3. PHP7中支持类型,善用

八、Trait 关键字

可以理解为类中的 include

 

(完)

添加评论

Powered by Typecho and Theme by Juexe © 2018 Juexe