PHP的面向对象

7-30 849 views

1、面向过程变成方法最大的缺点是编程效率不高,可扩展性差,程序代码的重用率低。为克服面向过程编程方法的缺点,面向对象编程技术应运而生。

2、基础知识

三大特性

  • 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
  • 继承:指一个对象直接使用另一对象的属性和方法。
  • 多态: 多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为

  • 描述了一组具有相同特性(属性)的相同行为(方法)的事物,使用关键词class

 

对象

  • 对象是类的实例化,使用关键字new进行实例化
  • 访问属性:$obj->name;
  • 访问方法:$obj->function();
  • $this指本对象;$self指本类;$parent指父类

类成员

  • 即类的属性

作用域:定义属性或方法的作用范围,PHP4用var定义,PHP5以后用以下三个

  • public:公用的属性和方法,可在类的外部或内部访问,默认属性
  • protected:被保护的属性和方法,可在类的内部和子类的内部进行访问
  • private:私有的属性和方法,可在类的内部进行访问,不会被继承

构造函数

  • 每次创建该类的对象时会自动调用此函数,适合完成初始化工作
  • PHP4把与类同名的函数都当做构造函数,PHP5中__construct()和同名函数都为构造函数,但前者优先级高

析构函数

  • 对象不再需要时会调用析构函数将对象从内存中销毁,适合做与对象有关的善后工作
  • 使用函数__destruct()

 

继承

  • 新类通过继承来共享已有类的行为,还可以修改或额外添加行为
  • 本质特征是行为共享
  • 继承使用关键字extends
  • 不支持多继承,但继承是可以多重的
  • 在子类中,常用partent::functionname()来调用父类的方法

final类和方法

  • 用于类,将使这个类不能被继承
  • 用于方法,可在子类中使用,但不能被覆盖

静态成员

  • 不需要对象实例就能够使用的属性或方法
  • 只保留一个变量值,所有实例共享这个成员
  • 声明,使用关键字static
  • 访问,使用范围解析符::,如:mysql::$key或mysql::function()

类常量

  • 声明:const XX=123456;
  • 访问:类名::XX;

克隆对象

  • 使用关键字clone建立一个与原对象拥有相同属性和方法的对象
  • 适用于在一个类的基础上实例化两个类似对象的情况
  • 语法:$new_obj = clone $old=obj;
  • 如需修改属性,使用魔术方法__clone

方法重载

  • 类多态性的一种实现
  • 指一个标识符被用做多个函数名且能够通过函数的参数个数或参数类型将这些同名的函数区分开来
  • 好处在于,不用为了不同的参数类型或参数个数而写多个函数
  • PHP5中,可用__call()实现方法重载,需含被调用的方法名称和传递给该方法的参数数组

单例模式

  • 顾名思义,即只有一个实例
  • 节约内存
  • 用于某些特殊场景,例如:购物车类

自动加载

  • 用于解决引进由不同开发人员开发的多个类库产生的冲突
  • 声明:function xxx()
  • 注册:spl_autoload_register('xxx')

魔术方法

  • 某些场景下,能够自动调用的方法
  • 常用的有:__construct/__destruct/__get/__set/__isset/__unset/__call等
  • 本质意义在于开发者和调用者对类的“控制权”

抽象类和方法

  • 用于指定某类的模板
  • 使用关键词abstract,抽象方法没有方法体
  • 抽象类中也可以有已经实现的方法,但只要有一个为抽象,则类仍是抽象
  • 抽象类不能实例化,只能被继承使用

接口

  • 抽象类可理解为“类的模板”,接口则是“方法的模板”,即接口的粒度更小,用于描述通用的方法
  • 声明:interface 接口名{方法1,方法2...}
  • 使用:class 类名 implements 接口名1,接口名2...{接口内方法}

异常

  • Exceptions是所有异常的基类
  • 抛出异常:throw new Exceptions('信息',数字)
  • 使用:try{}catch(Exception 对象){}
  • 不该出错的地方,却有可能出错,就用异常

命名空间

  • 声明某个空间,避免类重名,其后的类、函数,都会被封锁在命名空间内
  • 声明:namespace XXX;(必须放在页面首行)
  • 引用类:require()/include()/use XXX\类名

 

欢迎留言