Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP面向对象的那些事儿

PHP面向对象的那些事儿

作者头像
老高的技术博客
发布于 2022-12-27 08:23:49
发布于 2022-12-27 08:23:49
41300
代码可运行
举报
运行总次数:0
代码可运行

PHP的面向对象在进入5版本后得到了加强,很多好用的特性都得到了支持。下面总结了一些开发时用到的简单的概念,希望对你有帮助

继承关系

面向对象里说的最多的就是继承了吧!

最简单的关系就是a继承b,b又继承c,c继续继承d,是不是很像愚公移山啊!

愚公移山仅仅指的是子子孙孙,而继承关系远没有那么简单,因为愚公还有外甥和侄子呢!


接口和抽象类

接口和抽象类在我看来,其最终的目的都是为了解耦,听起来就很晕吧?其实仔细想想,并没有那么可怕!

接口

顾名思义,接口规范了行为,封装了功能。想想生活中常见的三口插座,他的功能是供电和能够被三口插头。请注意我加粗的动词,如果把三口插座实现为一个类,那么按照传统的做法,在类里面可能会有两个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function powerSuply($voltage){
    //传入电压或国家名
}
public function plugin($sockets){
    //传入插座口数
}

在考虑一下,如果又来个2口插座,美国插座,非洲插座,200口插座,那么在考虑规范和功能的时候就可以考虑把这两个方法抽象出来做成接口形式,只要你送来的东西有这两个方法,那么我就能够调用你,多方便啊!

需要注意的是:

  • 接口使用interface定义
  • 接口中定义的方法必须是public属性(接口就是被人“插”的,隐藏起来怎么用啊?)
  • 接口可以被继承extends
  • 接口中不能实现方法更不能实例化
  • 可以定义方法需要的参数
  • 不能定义变量或静态常量
  • 可以在接口中定义常量const,但是不能被子类或子接口修改。子类调用方法:Interface::CONSTVAR;
  • 更NB的是接口可以多重继承(方法多了注意不要重名)
  • 子类使用implements实现接口中所有方法,属性不变

抽象类

和接口很像,抽象类几乎能实现所有接口能做的事情!

先看看特点吧:

  • 抽象类使用abstract class定义
  • 抽象类中可以不实现方法,需将方法加上abstract属性,也可以实现方法,如__construct
  • 抽象类中方法的属性不限制,但是实例化的子类中方法属性必须更开放(如果原方法是public,继承后不能改为protected)
  • 子类使用extends继承抽象类,并需要实现所有抽象方法
  • 其他特性基本与接口相同
  • 抽象类不能实例化,但是静态方法还是可以直接调用的

区别

  • 接口与抽象类最大的区别就是多重继承了,某个类只能继承一个抽象类
  • 接口只能定义方法,不能实现方法,抽象类则没有限制
  • 方法属性不同,继承方法不同

权衡

之前见过一个帖子说,既然抽象类这么厉害,能够实现接口的所有功能,接口的存在是为什么?

其实根据二者的特点,就可以简单的总结出二者的优劣: 抽象类功能强大,但只能单一继承,没有接口灵活。

所以如果你要抽象一个实体,那么就用抽象类;如果你要抽象一动作,那就用接口!

判断实例

在框架开发中,为了使程序更加健壮,很需要对类的继承情况做限制,比如限制数据库驱动类必须继承于DB类等。

instanceof

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$a instanceof db

这行代码就是检验$a是否是一个特定的类或者继承于某个类,如果是,就会返回true。

通过实验,普通继承、接口、抽象类都可以用这个方法判断,包括多重继承也可以!

get_class

get_class接收一个实例化的类,返回类名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class bar {
    public function __construct()
    {
        var_dump(get_class($this));
        var_dump(get_class());
    }
}
class foo extends bar {
}
class T extends foo
{
}
new T;

get\_parent\_class

get\_parent\_class返回最近的继承关系,无视了接口,注意传递的参数为字符串时的返回值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class bar {
    public function __construct()
    {
        echo get_parent_class($this);
        echo get_parent_class('foo');
    }
}
class foo extends bar {
}
class T extends foo
{
}
new T;

is\_subclass\_of ( is_a() )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 如果此对象是该类的子类,则返回 TRUE
bool is_subclass_of ( object $object , string $class_name )

class_exists

检测一个类是否已定义,这个用在__autoload里在合适不过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function  __autoload ( $class )
{
    include( $class  .  '.php' );

     // Check to see whether the include declared the class
     if (! class_exists ( $class ,  false )) {
         trigger_error ( "Unable to load class:  $class " ,  E_USER_WARNING );
    }
}

method_exists

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 检查类的方法是否存在于指定的 object中。
bool method_exists ( mixed $object , string $method_name )

注意:此方法会无视protected与private属性的方法

其他方法

method\_exists、function\_exists、is_callable都是一些检测方法,虽然有些抽象,但是适当的使用可以让你的程序更加高效,健壮。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Laravel5.3之PHP反射(Reflection) (上)
说明:Laravel中经常使用PHP的反射特性来设计代码,本文主要学习PHP的反射特性,来提高写代码时的设计质量。PHP提供一套检测class, interface, trait, property, method的两个工具包:Introspection Functions和Reflection API,类似于探针一样的东西来探测这些一等公民。本文先看下Introspection Functions的使用。
botkenni
2022/01/10
2.2K0
Laravel5.3之PHP反射(Reflection) (上)
PHP 面向对象知识点
定义基本的类: 在类中我们可以定义各种数据成员和成员函数,其中public修饰的函数与变量可以在任何地方被调用,而private修饰的函数只能在本类中被调用子类不可调用,而protected修饰的则可以在本类和子类中被调用但不可以在外部调用.
王 瑞
2022/12/28
7820
php面试之面向对象的相关知识(下篇)
面向对象分上下篇,这里下篇涉及到的内容有:六、什么是对象克隆?  七、this、self和parent的区别是什么?  八、抽象类与接口有什么区别与联系?  九、PHP面向对象的常考面试题讲解
友儿
2022/09/11
5980
php面向对象第十四篇 接口 interface
接口: 第一个问题? 什么是多重继承? 这的多重继承的意思是说: 一个子类继承多个父类,就是多重继承了。 那为什么一个子类不能继承多个父类呢? 多重继承缺点:我成为觉得(继承)它的核心是子类继承父类,子类没有父类所具备的方法与属性的前提下。 多重继承子类继承多个父类是吧,如果两个父类都具备相同的方法,子类想要调用调用哪一个啊,兄弟。。 继承一个父类就不一样了呀。 接口的实现核心是什么? 因为接口是没有方法体的,所以实现了相当于想法变成了现实把。 记住,实现与覆盖虽然差不多,但是还是有一些不一样的,比如覆盖是覆盖具有方法体的,实现是覆盖没有方法体的啊(想法变成现实)。
贵哥的编程之路
2020/10/28
3190
php面向对象第十四篇 接口 interface
PHP 面向对象
面向对象三大特性:封装、继承、多态。 官方文档:http://php.net/manual/zh/language.oop5.php 要创建一个类的实例,必须使用 new 关键字。如果该类属于一个名字空间,则必须使用其完整名称。 你可以使用 ClassName::class 获取一个字符串,包含了类 ClassName 的完全限定名称。 $this self parent static 当一个方法在类定义内部被调用时,有一个可用的伪变量 $this。 使用 self:: 来访问静态方法和静态变量。 使用 s
康怀帅
2018/02/28
1.6K0
PHP面向对象基础总结
近来参加了几场PHP工程师的面试,但是笔试题答得都不理想,回来总结了一下失败的原因,是没看PHP手册。几家公司的PHP基础面试题都可以在PHP手册上找到。哎,现在才知道最好的面试宝典是PHP手册。
用户7657330
2020/08/14
1.5K0
谈谈你是怎么理解面向对象的?
一道经典的面试题,当面试官问你,你是怎么理解面向对象的即OOP,你应该怎么回答呢?
PHP学习网
2022/08/03
7960
PHP基础之面向对象篇
前面写的都是运算符、流程控制、排序查找等,下面说一说面向对象的一些内容。这是前面写的,有兴趣可以去看一看。 PHP入门之类型与运算符 PHP入门之流程控制 PHP入门之函数 PHP入门之数组 PHP基础之排序 PHP基础之查找 接下来写一下关于面向对象的内容。
雪痕@
2020/09/27
6810
PHP基础之面向对象篇
PHP 面向对象篇:抽象类与接口(下)
和很多其他语言面向对象编程实现一样,在 PHP 中,接口也是通过 interface 关键字声明的,接口中可以定义多个方法声明,这些方法声明不能有任何实现,并且这些方法的可见性都应该是 public,因为接口中的方法都要被其他类实现。例如,我们可以通过接口方式定义 Car(在 php_learning/oop 目录下创建 interface.php 来保存本教程代码):
学院君
2020/07/13
5330
PHP 面向对象篇:抽象类与接口(上)
上篇教程学院君给大家介绍了父子类之间的继承与方法重写,并且提到类作为参数类型声明时,子类实例可以转化为父类,但父类实例不能转化为子类,这是因为,子类必然包含了父类方法,反之则不一定。
学院君
2020/07/13
6460
php面试笔记(9)-php基础知识-面向对象考点
01 回顾真题 请写出 PHP 类权限控制修饰符 答案: public:公有类型 在类、子类、外部都可以访问 protected:受保护类型 在类、子类可以访问 private:私有类型 只要在子类可以访问 02 考点分析 02-1面向对象内容本考点主要是考察php中类中的权限控制修饰符,以及面及向对象的特性、魔术方法、设计模式等考点1继承 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为
学长冷月
2020/08/02
4580
简述面向对象思想_简述面向对象程序设计的特点
Java是一种面向对象的语言,那么什么是面向对象(Object Oriented Programming)? 首先,什么是对象(Object)?Java中有一种思想叫做“万物皆对象”,对象就是具有某些特殊属性(成员变量)和行为方式(方法)的实体。现实生活中的任何事物都可以看作是对象,无论是具体或抽象的事物,比如:一个动物或者是城市的变化。具有两个特征:属性(Property)和行为(Behavior)。 其次,什么是面向对象?
全栈程序员站长
2022/09/20
7530
类与面向对象学习
面向对象(Object Oriented,OO)其是以对象模型为基础进行的抽象过程,并在应用过程中形成了描述自己的抽象概念定义,包括对象、类、封装、继承以及多态等。
老雷PHP全栈开发
2020/07/02
3970
Java程序设计(面向对象)- 相关内容[通俗易懂]
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。 但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢? 分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
全栈程序员站长
2022/08/04
2020
Java程序设计(面向对象)- 相关内容[通俗易懂]
PHP面向对象-多态的实现(二)
抽象类也是PHP中实现多态的常用方法之一。抽象类是一个不能被实例化的类,它定义了一组抽象方法和一些非抽象方法。实现一个抽象类的类必须实现所有的抽象方法。
堕落飞鸟
2023/04/28
2140
PHP的抽象类和接口类有什么区别
抽象类(abstract class)和接口(interface)是 PHP 中实现面向对象编程的两种重要工具,它们之间有许多相似之处,但也有很多关键区别。以下是它们的主要区别:
Power
2025/04/01
1110
PHP中的类
用php以来,一直怀念java的类和对象,终于PHP 5 引入了新的对象模型(Object Model)。完全重写了 PHP 处理对象的方式,向java靠齐了。下面来了解下吧!
用户7657330
2020/08/14
7K0
PHP面向对象-类和对象的定义(五)
多态是面向对象编程中的另一个重要特性,它可以让不同的对象使用相同的方法,但是表现出不同的行为。在PHP中,多态可以通过接口和抽象类来实现。
堕落飞鸟
2023/04/27
6680
4:面向对象高级
继承弊端:打破了封装性。 final关键字: 1,final是一个修饰符,可以修饰类,方法,变量。 2,final修饰的类不可以被继承。 3,final修饰的方法不可以被覆盖。 4,final修饰的变量是一个常量,只能赋值一次。  为什么要用final修饰变量。其实在程序如果一个数据是固定的,  那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名称。  而且这个变量名称的值不能变化,所以加上final固定。 写法规范:常量所有字母都大写,多个单词,中间用_连接。 抽象类: 抽象:笼统,模糊,
六月的雨
2018/05/14
6990
Java 面向对象
概述:对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
星姮十织
2021/12/25
9040
相关推荐
Laravel5.3之PHP反射(Reflection) (上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验