第2章:PHP和对象

对象并不总是PHP项目的关键部分。实际上,它们曾经被描述为事后由PHP的设计师设计
经过深思熟虑,这一事实已被证明具有极大的弹性。在本章中,我将介绍本书的通过总结PHP面向对象功能的开发来覆盖对象
我们将看以下内容:
• PHP / FI 2.0:PHP,但我们所不知道
• PHP 3:对象首次出现
• PHP 4:面向对象的编程不断发展
• PHP 5:对象是语言的核心
• PHP 7:缩小差距

PHP对象的意外成功

借助PHP广泛的对象支持以及如此众多的面向对象的PHP库和应用程序,循环,PHP中对象的兴起似乎是自然而不可避免的过程的顶点。实际上,没有什么比事实更遥远了

在开始时:PHP / FI

众所周知,PHP的起源在于Rasmus Lerdorf使用Perl开发的两个工具。的PHP代表“个人主页工具”。FI代表Form Interpreter。它们一起构成了用于将SQL语句发送到数据库,处理表单和流程控制。这些工具用C语言重写,并以PHP / FI 2.0的名称组合。现阶段的语言看起来与我们今天所认识的语法不同,但是没有什么不同。支持变量关联数组和函数。但是,没有物体出现

语法糖:PHP 3

实际上,即使在PHP 3处于计划阶段时,对象也已不在议程之列。PHP的主要架构师3名是Zeev Suraski和Andi Gutmans。PHP 3是对PHP / FI 2.0的完全重写,但对象不是被视为新语法的必要部分
Zeev Suraski认为,几乎在事后才增加对课程的支持(1997年8月27日,准确地说)。实际上,类和对象只是定义和访问关联数组的另一种方法。当然,方法和继承的添加使类远远超过了荣耀的关联数组,但是您对类所做的操作仍然存在严格的限制。特别是,您可以不访问父类的重写方法(如果您不知道这意味着什么,请不要担心;我会稍后解释)。我将在下一节中讨论的另一个缺点是不够理想的方法对象是通过PHP脚本传递的。物体在当时是一个边缘问题,这是由于它们在官方场合缺乏突出性文档。该手册仅对对象使用一句话和一个代码示例。这个例子没有说明继承或属性

PHP 4和安静的革命

如果PHP 4是该语言的又一个突破性步骤,则大多数核心更改都发生在表面。Zend Engine(其名称源自Ze ev和A nd i)是从头开始编写的,旨在为语言。Zend Engine是驱动PHP的主要组件之一。您可能会使用的任何PHP函数实际上,小心呼叫实际上是高级扩展层的一部分。这些人忙于他们的名字,例如与数据库API对话或为您处理字符串。在此之下,Zend Engine管理内存,将控制委托给其他组件,并将您每天使用的熟悉的PHP语法转换为可运行的字节码。对于类等核心语言功能,我们必须感谢Zend Engine
从我们的目标角度来看,PHP 4使重写父方法和从孩子班级访问他们是一个重大好处。然而,主要缺点仍然存在。将对象分配给变量,然后将其传递给函数,或者从方法返回它会导致复制。考虑这样的作业:

$my_obj = new User('bob'); 
$other = $my_obj;

这导致存在两个User对象,而不是对同一个User对象的两个引用。在对于大多数面向对象的语言,您希望通过引用而不是值进行赋值。这意味着您将传递并分配指向对象的句柄,而不是复制对象本身。的默认的按值传递行为会导致许多模糊的错误,因为程序员不经意间修改了对象在脚本的一部分中,期望可以通过其他地方的引用看到更改。在整本书中,您将会看到许多示例,其中我维护了对同一对象的多个引用
幸运的是,有一种强制传递引用的方法,但这意味着要记住使用笨拙的方法。施工
这是通过引用分配的方式

$other =& $my_obj;
//$other and $my_obj point to same object

这将强制通过引用:

function setSchool(& $school)
{
  // $school is now a reference to not a copy of passed object
}

这是通过引用返回:

function & getSchool()
{
  // returning a reference not a copy
  return $this->school; 
}

尽管这很好用,但很容易忘记添加“&”号,这太简单了使错误爬入面向对象的代码。很难找到这些,因为它们很少导致了任何报告的错误,只是看起来合理但已损坏的行为
在PHP手册中扩展了一般语法的覆盖范围,尤其是对象的覆盖范围,面向导向的编码开始流行起来。PHP中的对象并非毫无争议(然后,现在,毫无疑问),诸如“我是否需要对象?”之类的邮件在邮件列表中是常见的诱饵。确实,Zend网站主持了鼓励与其他对象并排进行面向对象编程的文章发出警告音。尽管存在通过引用传递和争议的问题,但许多编码人员才刚加入并在其代码中加上“&”字符。面向对象的PHP越来越流行。Zeev Suraski在DevX.com的文章http://www.devx.com/webdev/Article/10007/0/page/1

PHP历史上最大的变化之一是,尽管功能非常有限,尽管存在许多问题和局限性,PHP中的面向对象编程蓬勃发展,并成为越来越多现成的最受欢迎的范例PHP应用程序。这种趋势(通常是出乎意料的)使PHP处于次优状态情况。很明显,对象的行为不像其他OO中的对象语言,并且行为类似[关联]数组

如上一章所述,在站点和文章中对面向对象设计的兴趣变得显而易见。线上。PHP的官方软件存储库PEAR本身包含面向对象的编程。用事后看来,人们很容易想到PHP采用了面向对象的支持,这是对必然的力量。重要的是要记住,尽管面向对象的编程已经存在自1960年代以来,它确实在1990年代中期获得了发展。直到普及Java才发布1995年。C ++是一种过程语言C的超集,自1979年以来一直存在。可以说,在1990年代,飞跃到了大时代。Perl 5于1994年发布,又一次革命在以前的程序语言中,使用户可以思考对象(尽管有些人认为,Perl的面向对象支持也像是事后的想法)。对于一个小在过程语言中,PHP非常快速地开发了其对象支持,显示了对用户的要求

拥抱变化:PHP 5

PHP 5表示对对象和面向对象编程的明确认可。那不是说对象是使用PHP的唯一方法(顺便说一下,本书也没有这样说)。对象但是,PHP被认为是开发企业系统的强大而重要的手段,而PHP在其核心设计中完全支持他们
可以说,PHP 5增强功能的一个显着效果是通过以下方式采用了该语言:较大的互联网公司。两者都是Yahoo! 例如,Facebook开始在内部广泛使用PHP他们的平台。在版本5中,PHP成为开发和企业级的标准语言之一在网上
对象已从事后转变为语言驱动程序。也许最重要的变化是默认的按引用传递行为取代了对象复制的弊端。那只是但是开始。在本书的整个过程中,尤其是在本书的这一部分,我们将遇到更多增强功能,包括私有和受保护的方法和属性,static关键字,名称空间,类型提示(现在称为类型声明)和异常。PHP 5出现了很长时间(大约十二年)年),并且逐步发布了重要的新功能
例如,PHP 5.3带来了名称空间。这些使您可以为类创建命名范围,并且函数,这样在包含库并扩展您的库时,您不太可能遇到重复的名称系统。它们还会使您摆脱难看但必要的命名约定,例如:

class megaquiz_util_Conf
{
}

这样的类名是防止软件包之间冲突的一种方法,但是它们可以使曲折的代码。我们还看到了对闭包,生成器,特征和后期静态绑定的支持
PHP 7:缩小差距
程序员的需求量很大。对于许多对设计模式感兴趣的人,PHP具有两个关键功能仍然缺乏。这些是标量类型声明和强制返回类型。使用PHP 5可以强制传递给函数或方法的参数类型,只要您只需要对象,数组或更高版本的可调用代码。标量值(如整数,字符串和浮点数)无法强制执行完全没有 此外,如果您想声明一个方法或函数的返回类型,那么您将完全退出运气
如您所见,面向对象的设计通常使用方法声明作为一种契约。的方法需要一定的输入,并且,相反,它保证会为您提供特定类型的数据。PHP 5程序员被迫依靠注释,约定和手动类型检查来维护在许多情况下都是这种合同。开发人员和评论员经常对此抱怨。这里有一个引用本书前一版的内容

…仍然没有承诺为提示的返回类型提供支持。这将允许您可以在方法或函数的声明中声明其返回的对象类型。这个然后将由PHP引擎强制执行。提示的回报类型将进一步改善PHP对模式原则的支持(诸如“接口代码,而不是实施”)。我希望有一天可以修订这本书以涵盖该功能

我很高兴写下这一天!PHP 7引入了标量类型声明(以前(称为类型提示)和返回类型声明,您将在此版本中看到它们使用了很多内容。PHP 7还提供了其他一些不错的功能,包括匿名类和一些名称空间增强功能

倡导与不可知论:客体辩论

本书自然地在整个过程中都表现出面向对象的偏见,这种偏见反映出我感染了对象外表。因为这本书是对对象的庆祝,也是对面向对象设计的介绍,所以它是不可避免地,重点毫无疑问地是面向对象的。但这本书无意于建议对象是使用PHP编码成功的真正途径
开发人员是否选择使用PHP作为面向对象的语言曾经是一个问题偏爱。在一定程度上,使用以下方法创建完全可接受的工作系统仍然是正确的。功能和全局代码。一些出色的工具(例如WordPress)仍在其基础程序中体系结构(尽管这些天甚至可以广泛使用对象)。然而,它正在变成在不使用和理解PHP对对象的支持的情况下,越来越难以成为一名PHP程序员,尤其是因为您可能会在项目中依赖的第三方库本身面向对象
不过,正如您所读,值得记住的是著名的Perl座右铭:“有不止一种方法可以对于较小的脚本,尤其如此,在这些脚本中,迅速建立起可以运行的示例的作用更大。比构建可以很好地扩展到更大系统的结构更重要(此类临时项目通常称为“尖峰”
代码是一种灵活的媒介。诀窍是要知道您的快速概念验证何时会成为基础大型开发,并且在纯粹的持久决策为您做出持久设计决定之前停下来代码的权重。现在,您已经决定对成长中的项目采用面向设计的方法,我希望本书为您开始构建面向对象的体系结构提供所需的帮助

摘要

本简短的章节将对象放置在PHP语言的上下文中。PHP的未来非常多与面向对象的设计捆绑在一起。在接下来的几章中,我将简要介绍PHP当前的支持对象特性,并介绍一些设计问题

你可能感兴趣的:(第2章:PHP和对象)