Home > Backend Development > PHP Tutorial > 一文详解PHP中实现多继承的方法

一文详解PHP中实现多继承的方法

PHPz
Release: 2023-02-09 17:16:33
forward
2150 people have browsed it

本篇文章给大家带来了关于php的相关知识,其中主要介绍了PHP是如何实现多继承的,感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助。

一文详解PHP中实现多继承的方法

这个题目在面试的时候经常会遇见

  • PHP继承是只能单继承的。 那如何实现多继承呢? 可以使用interface和trait来实现多继承功能。

interface

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 由于接口(interface)和类(class)、trait 共享了命名空间,所以它们不能重名。
接口就像定义一个标准的类一样,通过 interface 关键字替换掉 class 关键字来定义,但其中所有的方法都是空的。
接口中定义的所有方法都必须是 public ,这是接口的特性。
在实践中,往往出于两个辅助目的使用接口:
因为实现了同一个接口,所以开发者创建的对象虽然源自不同的类,但可能可以交换使用。 常用于多个数据库的服务访问、多个支付网关、不同的缓存策略等。 可能不需要任何代码修改,就能切换不同的实现方式。
能够让函数与方法接受一个符合接口的参数,而不需要关心对象如何做、如何实现。 这些接口常常命名成类似 Iterable、Cacheable、Renderable, 以便于体现出功能的含义。

我个人觉得interface其实不能叫多继承。毕竟interface只能实现方法的具体实现。而真正的继承,是能够将函数体一起继承过来直接使用。

<?php

interface a{
    public function auth();
    public function test();}interface aa{
    public function cc();
    public function bb();}class b implements a,aa{

    public function auth()
    {
        echo &#39;auth&#39;;
        // TODO: Implement auth() method.    }

    public function test()
    {
        echo &#39;test&#39;;
        // TODO: Implement test() method.    }

    public function cc(){
        echo 1;
    }

    public function bb(){
        echo 2;
    }}$a = new b();$a->cc();
Copy after login
Copy after login

上述代码可以看出来implements后面可以带多个接口,从而实现的多继承

  • 什么时候用接口?
  1. 定规范,保持统一性;
  2. 多个平级的类需要去实现同样的方法,只是实现方式不一样
  • 接口使用规范

    接口不能实例化
    接口的属性必须是常量
    接口的方法必须是public【默认public】,且不能有函数体
    类必须实现接口的所有方法
    一个类可以同时实现多个接口,用逗号隔开
    接口可以继承接口【用的少】

triat

PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

<?php
trait eat{
    public function eatSomething(){
        echo &#39;我是代码复用&#39;;
    }}class Xiaoming{
    use eat;}$a = new Xiaoming();$a->eatSomething();
Copy after login
Copy after login

相当于可以直接把trait定义的方法 全部加载到类里面来进程使用。这才是实现多继承的真正解决方案。

这个题目在面试的时候经常会遇见

  • PHP继承是只能单继承的。 那如何实现多继承呢? 可以使用interface和trait来实现多继承功能。

interface

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 由于接口(interface)和类(class)、trait 共享了命名空间,所以它们不能重名。
接口就像定义一个标准的类一样,通过 interface 关键字替换掉 class 关键字来定义,但其中所有的方法都是空的。
接口中定义的所有方法都必须是 public ,这是接口的特性。
在实践中,往往出于两个辅助目的使用接口:
因为实现了同一个接口,所以开发者创建的对象虽然源自不同的类,但可能可以交换使用。 常用于多个数据库的服务访问、多个支付网关、不同的缓存策略等。 可能不需要任何代码修改,就能切换不同的实现方式。
能够让函数与方法接受一个符合接口的参数,而不需要关心对象如何做、如何实现。 这些接口常常命名成类似 Iterable、Cacheable、Renderable, 以便于体现出功能的含义。

我个人觉得interface其实不能叫多继承。毕竟interface只能实现方法的具体实现。而真正的继承,是能够将函数体一起继承过来直接使用。

<?php

interface a{
    public function auth();
    public function test();}interface aa{
    public function cc();
    public function bb();}class b implements a,aa{

    public function auth()
    {
        echo &#39;auth&#39;;
        // TODO: Implement auth() method.    }

    public function test()
    {
        echo &#39;test&#39;;
        // TODO: Implement test() method.    }

    public function cc(){
        echo 1;
    }

    public function bb(){
        echo 2;
    }}$a = new b();$a->cc();
Copy after login
Copy after login

上述代码可以看出来implements后面可以带多个接口,从而实现的多继承

  • 什么时候用接口?
  1. 定规范,保持统一性;
  2. 多个平级的类需要去实现同样的方法,只是实现方式不一样
  • 接口使用规范

    接口不能实例化
    接口的属性必须是常量
    接口的方法必须是public【默认public】,且不能有函数体
    类必须实现接口的所有方法
    一个类可以同时实现多个接口,用逗号隔开
    接口可以继承接口【用的少】

triat

PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

<?php
trait eat{
    public function eatSomething(){
        echo &#39;我是代码复用&#39;;
    }}class Xiaoming{
    use eat;}$a = new Xiaoming();$a->eatSomething();
Copy after login
Copy after login

相当于可以直接把trait定义的方法 全部加载到类里面来进程使用。这才是实现多继承的真正解决方案。

推荐学习:《PHP视频教程

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template