R0ot's Blog

分享代码,记录生活

0%

PHP的类与对象

一些基本概念

  1. 定义类
    在php中使用class name{}
  2. 实例化
    使用 $name=new name();创建一个对象$name。
  3. 类属性与类方法
    在类的外部使用类属性和类方法时,要通过实例化的对象$name ->a ,$name ->a()
    类的内部访问时要通过伪变量$this ->($this当前的对象)
  4. 类常量
    在类的内部定义常量用const关键字,类中的常量归类所有,而不是归对象所有,要访问类中的对象,在外部可以使用类名::常量名,在类的内部可以使用self::类名调用(self当前的类)。
  5. static(静态)
    –声明类的属性或方法为 static(静态),就可以不实例化类而直接访问。声明为静态后,此时的方法和属性就归类所有,不归对象所有。
    –静态成员的访问,外部:类名::成员名,内部:可以使用self::成员名类名::成员名.(成员包括属性与方法)
    –实际上,在低版本中php中的方法默认是静态的,所以事实上静态方法还是可以通过实例化的对象访问(不推荐),静态属性则不行。
    –由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

继承

  1. 继承的格式
    class 子类名 extends 父类名{}
  2. 特点
    –php语言是单继承
    –子类会继承父类的公共的和受保护的成员属性和方法
    –子类可以扩展新的属性和方法
    –子类可以有和父类同名的方法和属性,这时候子类会覆盖父类,叫做重载。这时候要调用原 本的父类方法可以用parent::方法(),而$this->方法()则是使用子类重载后的方法。
    –魔术方法也可以被子类继承
    –如果子类没有构造方法,将继承父类的构造方法,如果有,则覆盖父类的构造方法(重载)
    可以用parent::__construct()调用父类的构造方法
    –如果父类中的办法被声明为final,则子类无法覆盖该办法.同样如果一个类被声明为final,则不能被继承.需要注意的是:属性不能被定义为final,只有类和办法才能被定义final.

访问控制与封装

在类中创建属性(成员变量)和方法(成员函数)时,需要在前面加上访问控制关键词
* public (公有):公有的类成员可以在任何地方被访问。
* protected (受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
* private (私有):私有的类成员则只能被其定义所在的类访问。
* 注意:子类继承父类的方法后重载,访问控制只能和原先相同或者更宽松

魔术方法

魔术方法是一种在类中的特殊函数,所以的魔术方法都是以__双下划线开头的
主要从 触发时机作用参数返回值 四个方面来分析一个魔术方法

  1. 构造函数
    __construct()
    -触发时机:在对象进行实例化的时候自动触发
    -作用:初始化成员属性
    -参数:无
    -返回值:无
  2. 析构函数
    __destruct()
    -触发时机:在对象销毁时自动触发(unset() 或 页面执行完毕)
    -作用:回收对象使用过程中的资源
    -参数:无
    -返回值:无
  3. __get($propertyName)
    -触发时机:类的外部访问私有成员,不存在成员的时候自动触发
    -作用:1.防止报错,2.提供访问私有属性的后门(不能修改)
    -参数:一个,是访问的私有对象的属性名称
    -返回值:可以有,可以没有
  4. __set($propertyName,$value)
    -触发时机:类的外部设置私有成员的值时候自动触发
    -作用:1.防止报错,2.设置私有属性
    -参数:两个,是访问的私有对象的属性名称,属性的值
    -返回值:无
  5. __isset($propertyName)
    -触发时机:在类外部对私有成员进行isset检测时自动触发
    -作用:代替外部isset,在类的内部进行变量检测
    -参数:一个,是检测的私有成员的属性名称
    -返回值:返回一个布尔值,是isset的结果
  6. __unset()
    -触发时机:试图对私有成员进行unset删除时自动触发
    -作用:代替外部unset,在类的内部进行变量删除
    -参数:一个,是要删除的私有成员的属性名称
    -返回值:无
  7. __call($funName,$arguments)__callStatic()静态
    -触发时机:在对象调用一个不可访问,不存在的方法时自动触发
    -作用:防止调用的方法不存在而导致程序终止
    -参数:两个,$funName是不存在的函数名,$arguments是以数组的形式接收不存在方法的多个参数
    -返回值:可以返回任意类型的值
  8. __toString()
    -触发时机:一个类被当成字符串时自动触发(例如echo 一个对象名)
    -作用:防止报错,返回一个字符串
    -参数:无
    -返回值:必须返回一个字符串
  9. __invoke()
    -触发时机:当你试图以函数的方式调用一个对象时,这个方法会被自动调用。
    -作用:防止报错,可以在这个方法里实现任意操作
    -参数:可以接受任意数量的参数
    -返回值:可以返回任意类型的值。
  10. __autoload($ClassName)
    -触发时机:使用一个未定义的类时,自动调用 __autoload() 函数
    -作用:当通过new来实例化一个类时,通过__autoload自动包含对应的文件
    -参数:一个参数,即未定义的类名
    -返回值:无
    -实例:
    1
    2
    3
    4
    function __autoload($class_name) {
    include $class_name . '.php';
    }
    $obj = new MyClass();
  11. __sleep()
    -触发时机:在类外部调用序列化serialize()时自动调用
    -作用:如果只想序列化对象中的某些属性,只有返回的数组中有的属性名才会被序列化
    -参数:无
    -返回值:返回一个包含对象中需要序列化的属性名的数组。
  12. __wakeup
    -触发时机:在类外部调用反序列化unserialize()时自动调用
    -作用:重新初始化对象的状态,或者重新建立数据库连接、重新分配资源等。(比如在构造函数中给属性赋值了,但是序列化时只保留属性,可以在反序列化时重新赋值)
    -参数:无
    -返回值:无