• PHP之面向对象小结


    PHP 中创建对象

    类创建后,我们可以使用 new 运算符来实例化该类的对象:

    $runoob = new Site;
    

    PHP 构造函数

    构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

    function __construct( $par1, $par2 ) {
    $this->url = $par1;
    $this->title = $par2;
    }
    

    析构函数

    析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。 PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:

    void __destruct ( void )
    

    继承

    PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:

    class Child extends Parent {
    // 代码部分
    }
    

    方法重写

    如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

    访问控制

    PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。

    • public(公有):公有的类成员可以在任何地方被访问。
    • protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
    • private(私有):私有的类成员则只能被其定义所在的类访问。

    属性的访问控制

    类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

    方法的访问控制

    类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

    接口

    使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 接口中定义的所有方法都必须是公有,这是接口的特性。 要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

    常量

    可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。 常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。 自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。

    抽象类

    任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。 定义为抽象的类不能被实例化。 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。

    Static 关键字

    声明类属性或方法为 static(静态),就可以不实例化类而直接访问。 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。 由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。 静态属性不可以由对象通过 -> 操作符来访问。 自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

    Final 关键字

    PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

    调用父类构造方法

    PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。

    <?php
    class BaseClass {
    function __construct() {
        print "BaseClass 类中构造方法" . PHP_EOL;
    }
    }
    class SubClass extends BaseClass {
    function __construct() {
        parent::__construct();  // 子类构造方法不能自动调用父类的构造方法
        print "SubClass 类中构造方法" . PHP_EOL;
    }
    }
    class OtherSubClass extends BaseClass {
        // 继承 BaseClass 的构造方法
    }
    
    // 调用 BaseClass 构造方法
    $obj = new BaseClass();
    
    // 调用 BaseClass、SubClass 构造方法
    $obj = new SubClass();
    
    // 调用 BaseClass 构造方法
    $obj = new OtherSubClass();
    ?>
    

    执行以上程序,输出结果为:

    BaseClass 类中构造方法
    BaseClass 类中构造方法
    SubClass 类中构造方法
    BaseClass 类中构造方法 
    

    若声明子类构造方法但不调用父类构造方法则子类构造方法执行但父类构造方法不执行

    若声明子类构造方法并调用父类构造方法则子类构造方法和父类构造方法都执行

    若不声明子类构造方法,则会默认调用父类构造方法。

  • 相关阅读:
    noip模拟赛#38
    noip模拟赛#45
    noip模拟赛#15
    noip模拟赛#14
    noip模拟赛
    rp++
    bzoj2127: happiness
    bzoj3209:3209: 花神的数论题
    10.1 plan
    FFT
  • 原文地址:https://www.cnblogs.com/sinceForever/p/7553731.html
Copyright © 2020-2023  润新知