• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解

    本文实例讲述了PHP中abstract(抽象)、final(最终)和static(静态)原理与用法。分享给大家供大家参考,具体如下:

    abstract(抽象)

    PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现

    继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的(严格程度:private>protected>public),而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

    总结:

    1. 抽象类不能被实例化;
    2. 类中有任何抽象方法那这个类也必须为抽象的;
    3. 抽象类只能申明调用方式和参数,不能定义具体功能实现;
    4. 继承抽象类的子类必须实现抽象类的所有抽象方法;
    5. 子类中实现的抽象方法的访问控制必须比父类的访问控制更严格;
    6. 子类中实现的方法的调用方式及参数数量必须与被实现的方法一致。

    例:

    ?php
    abstract class AbstractClass
    {
      // 强制要求子类定义这些方法,不定义功能实现
      abstract protected function getValue();
      abstract protected function prefixValue($prefix);
    
      // 普通方法(非抽象方法),子类可以不重写
      public function printOut() {
        print $this->getValue() . "\n";
      }
    }
    
    class ConcreteClass1 extends AbstractClass
    {
      protected function getValue() {
        return "ConcreteClass1";
      }
    
      public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
      }
    }
    
    class ConcreteClass2 extends AbstractClass
    {
     //访问方式可以更宽松
      public function getValue() {
        return "ConcreteClass2";
      }
    
      public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
      }
    }
    
    $class1 = new ConcreteClass1;
    $class1->printOut();
    echo $class1->prefixValue('FOO_') ."\n";
    
    $class2 = new ConcreteClass2;
    $class2->printOut();
    echo $class2->prefixValue('FOO_') ."\n";
    ?>
    
    
    ?php
    abstract class AbstractClass
    {
      // 我们的抽象方法仅需要定义需要的参数
      abstract protected function prefixName($name);
    
    }
    
    class ConcreteClass extends AbstractClass
    {
    
      // 我们的子类可以定义父类签名中不存在的 可选参数
      public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
          $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
          $prefix = "Mrs";
        } else {
          $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
      }
    }
    
    $class = new ConcreteClass;
    echo $class->prefixName("Pacman"), "\n";
    echo $class->prefixName("Pacwoman"), "\n";
    ?>
    
    

    final

    如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

    这个比较好理解,不做赘述

    static

    声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

    为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。

    由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

    静态属性不可以由对象通过 -> 操作符来访问。

    用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。

    就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

    自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

    总结:

    1. 静态方法无需实例化,可直接访问;
    2. 类实例化的对象无法访问类中的静态属性,但是可以访问静态方法;
    3. 伪变量 $this 在静态方法中不可用;
    4. 静态属性不可以由对象通过 -> 操作符来访问;
    5. 用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误;
    6. 静态属性只能被初始化为文字或常量,不能使用表达式(函数返回值/宁一个变量/对象);
    7. 可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
    ?php
    class Foo
    {
      public static $my_static = 'foo';
    
      public function staticValue() {
        return self::$my_static;
      }
    }
    
    class Bar extends Foo
    {
      public function fooStatic() {
        return parent::$my_static;
      }
    }
    
    print Foo::$my_static . "\n";
    
    $foo = new Foo();
    print $foo->staticValue() . "\n";
    print $foo->my_static . "\n";   // Undefined "Property" my_static 
    
    print $foo::$my_static . "\n";
    $classname = 'Foo';
    print $classname::$my_static . "\n"; // As of PHP 5.3.0
    
    print Bar::$my_static . "\n";
    $bar = new Bar();
    print $bar->fooStatic() . "\n";
    ?>
      /programlisting>
     /example>
    
     example>
      title>静态方法示例/title>
      programlisting role="php">
    ![CDATA[
    ?php
    class Foo {
      public static function aStaticMethod() {
        // ...
      }
    }
    
    Foo::aStaticMethod();
    $classname = 'Foo';
    $classname::aStaticMethod(); // 自 PHP 5.3.0 起
    ?>
    
    

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • Django User 模块之 AbstractUser 扩展详解
    • JavaSE static final及abstract修饰符实例解析
    • Python2和Python3中@abstractmethod使用方法
    • JAVA抽象类和抽象方法(abstract)实例分析
    • Springboot源码 AbstractAdvisorAutoProxyCreator解析
    • java编程abstract类和方法详解
    • 浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题
    • Django如何继承AbstractUser扩展字段
    上一篇:PHP标准库 (SPL)——Countable用法示例
    下一篇:PHP预定义接口——Iterator用法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解 PHP,中,abstract,抽象,final,