资讯专栏INFORMATION COLUMN

PHP核心技术与最佳实践(第一章 面向对象思想的核心概念)

dreamGong / 2411人阅读

摘要:现代的面向对象的思想不强调为真实世界建模变得更加理性化一些,把目标放在解耦上。各种语言中的多态多态确切的含义是同一类的对象收到相同消息时,会得到不同的结果。小结本章主要介绍面向对象思想的程序的组成元素类和对象。

第一章 面向对象思想的核心概念

代码:

class object
{
    public $name;
    public $gender;
    public function say(){
        echo $this->name."is".$this->gender;
    }
}
$student = new object();
$student->name = "Tom";
$student->gender = "male";
$student->say();

//由于PHP 的对象是用数组来模拟的,因此把对象转换为数组,就能查看这个对象的所有属性了
var_dump($student);
var_dump((array)$student);//(array)对象类型转换成数组,打印属性值
var_dump(array($student));
print_r((array)$student);
echo "
"; //对象序列化 $str = serialize($student); echo $str."
"; file_put_contents("store.txt",$str); //反序列化,取出这个对象 $str = file_get_contents("store.txt"); $student = unserialize($str); $student->say(); 结果: Tomismale object(object)[1] public "name" => string "Tom" (length=3) public "gender" => string "male" (length=4) array (size=2) "name" => string "Tom" (length=3) "gender" => string "male" (length=4) array (size=1) 0 => object(object)[1] public "name" => string "Tom" (length=3) public "gender" => string "male" (length=4) Array ( [name] => Tom [gender] => male ) O:6:"object":2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";} Tomismale

1.3 继承与多态

面向对象的优势在于类的复用继承与多态都是对类进行复用,它们一个是类级别的复用,一个是方法级别的复用提到继承必提组合,二者有何异同?PHP到底有没有多态?若没有,则为什么没有?有的话,和其他语言中

在继承中,用parent指代父类,用self指代自身。使用“::”运算符(范围解析操作符)调用父类的方法。
通过一些总结,得出了继承是一种“是、像”的关系,而组合是一种“需要”的关系。利用这条规律,就可以很简单地判断出父亲与儿子应该是继承关系,父亲与家庭应该是组合关系。还可以从另外一个角度看,组合偏重整体与局部的关系,而继承偏重父与子的关系。

    耦合是一个软件结构内不同模块之间互连程度的度量,也就是不同模块之间的依赖关系。
低耦合指模块与模块之间,尽可能地使模块间独立存在;模块与模块之间的接口尽量少而简单。现代的面向对象的思想不强调为真实世界建模,变得更加理性化一些,把目标放在解耦上。
解耦是要解除模块与模块之间的依赖。
按照这个思想,继承与组合二者语义上难于区分,在二者均可使用的情况下,更倾向于使用组合。为什么呢?继承存在什么问题呢?
    1)继承破坏封装性。
比如,定义鸟类为父类,具有羽毛属性和飞翔方法,其子类天鹅、鸭子、鸵鸟等继承鸟这个类。显然,鸭子和鸵鸟不需要飞翔这个方法,但作为子类,它们却可以无区别地使用飞翔这个方法,显然破坏了类的封装性。而组合,从语义上来说,要优于继承。
    2)继承是紧耦合的。
继承使得子类和父类捆绑在一起。组合仅通过唯一接口和外部进行通信,耦合度低于继承。
    3)继承扩展复杂。
随着继承层数的增加和子类的增加,将涉及大量方法重写。使用组合,可以根据类型约束,实现动态组合,减少代码。
    4)不恰当地使用继承可能违反现实世界中的逻辑。

1.3.2 各种语言中的多态

    多态确切的含义是:同一类的对象收到相同消息时,会得到不同的结果。而这个消息是不可预测的。多态,顾名思义,就是多种状态,也就是多种结果。
    区别是否是多态的关键在于看对象是否属于同一类型。如果把它们看做同一种类型,调用相同的函数,返回了不同的结果,那么它就是多态;否则,不能称其为多态。由此可见,弱类型的PHP里多态和传统强类型语言里的多态在实现和概念上是有一些区别的,而且弱类型语言实现起多态来会更简单,更灵活。
    本节解决了什么是多态,什么不是多态的问题。至于多态是怎么实现的,各种语言的策略是不一样的。但是,最终的实现无非就是查表和判断。总结如下:
    多态指同一类对象在运行时的具体化。
    PHP语言是弱类型的,实现多态更简单、更灵活。
    类型转换不是多态。
    PHP中父类和子类看做“继父”和“继子”关系,它们存在继承关系,但不存在血缘关系。 因此子类无法向上转型为父类,从而失去多态最典型的特征。
多态的本质就是if…else,只不过实现的层级不同。

1.4 面向接口编程

狭义的接口,即interface关键字。广义的接口可以是任何一个对外提供服务的出口,比如提供数据传输的USB接口、淘宝网对其他网站开放的支付宝接口。

接口作为一种规范和契约存在。作为规范,接口应该保证可用性;作为契约,接口应该保证可控性。
接口只是一个声明,一旦使用interface关键字,就应该实现它。可以由程序员实现(外部接口),也可以由系统实现(内部接口)。接口本身什么都不做,但是它可以告诉我们它能做什么。
PHP中的接口存在两个不足,一是没有契约限制,二是缺少足够多的内部接口。
接口其实很简单,但是接口的各种应用很灵活,设计模式中也有很大一部分是围绕接口展开的。

1.5 反射

面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。
反射,直观理解就是根据到达地找到出发地和来源。比方说,我给你一个光秃秃的对象,我可以仅仅通过这个对象就能知道它所属的类、拥有哪些方法。
反射指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。

小结

本章主要介绍面向对象思想的程序的组成元素——类和对象。类是一个动作和属性的模板,对象是数据的集合。结合PHP自身实际情况,着重讲述PHP里面向对象的一些比较模糊的知识点,包括魔术方法、接口、多态、类的复用、反射、异常机制等。接口是一种类型,从接口的实现讲述接口是怎么实现“即插即用”的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22893.html

相关文章

  • 学习Java必读10本书籍

    摘要:学习编程的本最佳书籍这些书涵盖了各个领域,包括核心基础知识,集合框架,多线程和并发,内部和性能调优,设计模式等。擅长解释错误及错误的原因以及如何解决简而言之,这是学习中并发和多线程的最佳书籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 来源 | 愿码(ChainDesk.CN)内容编辑 愿码Slo...

    masturbator 评论0 收藏0
  • 全栈是概念,兴趣亦为追求(全栈开发者)

    摘要:耐得住寂寞,才能等得到花开慢慢积累自己的知识,不断叠加,全面优化,无论在哪个领域都可以有你的一席之地,即为有志者事竟成,破釜沉舟,百二秦关终属楚也祝我们能向未来发展的开发者们苦心人天不负,卧薪尝胆,三千越甲可吞吴。 我们今天来了聊一聊一个话题——全栈开发 作为一个程序员,不管是Java还是C...

    lbool 评论0 收藏0
  • 区块链开发中使用最流行编程语言

    摘要:我们目前正处于一个新兴的区块链开发行业中。,一种在以太坊开发人员中流行的新的简单编程语言,因为它是用于开发以太坊智能合约的语言。它是全球至少万开发人员使用的世界上最流行的编程语言之一。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 我们目前正处于一个新兴的区块链开发行业中。区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣。由于许多...

    2shou 评论0 收藏0
  • PHPer书单

    摘要:想提升自己,还得多看书多看书多看书下面是我收集到的一些程序员应该看得书单及在线教程,自己也没有全部看完。共勉吧当然,如果你有好的书想分享给大家的或者觉得书单不合理,可以去通过进行提交。讲师温铭,软件基金会主席,最佳实践作者。 想提升自己,还得多看书!多看书!多看书!下面是我收集到的一些PHP程序员应该看得书单及在线教程,自己也没有全部看完。共勉吧!当然,如果你有好的书想分享给大家的或者...

    jimhs 评论0 收藏0
  • Java开发区块链三大sdk库

    摘要:是企业与区块链相遇的地方。的框架旨在成为开发区块链解决方案的支柱。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 如果你想将区块链合并到一个Java项目中,现在我们来看看就是这个细分领域中三个最大的OSS玩家。 好的伙计们,我们都听说过比特币,以太坊或其他加密货币,其中有一些时髦的名字围绕着我们常见的新闻,但我们作为Java开发人员知道如何轻松地与这些区块链技术进行交互吗?以...

    iKcamp 评论0 收藏0

发表评论

0条评论

dreamGong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<