PHP仍然是程序整体吗?

Pos*_*Guy -6 php programming-languages

我知道PHP 5有一些面向对象的相似之处,但它还不是真正的OOP环境吗?它还有一个真正的编译器吗?我看到编译脚本仍然意味着程序性.我认为它不是真正的编译器,因为那里的任何PHP编译器都不会创建程序集?

Jon*_*tte 7

我想你应该读一下你正在使用的词的定义!

"程序集"是.NET使用的一个词,它被松散地翻译为"一个DLL加上你可以部署的一些支持." 也许你在考虑"汇编代码"?

编译器编译为各种表示形式.JVM字节码,CLR字节码,x86字节码,Python字节码,MIPS字节码,ARM字节码,......这些都是编译器的有效目标.请注意,对于JVM和x86字节码,存在硬件(CPU)和软件(解释器)执行环境,因此目标代码是否为"硬件"并不真正发挥作用.

编写代码与解释代码并不意味着任何涉及OO与程序与功能的关系.OO与支持多态性,数据隐藏,数据接口实现和可组合性有关.

PHP支持所有这些,因此您可以使用它以直接的方式实现OO设计,所以我会说PHP支持OO.

最后:你应该看看Facebook PHP编译器,它将PHP编译为C,然后编译为C到x86,与传统的PHP执行环境相比,这显然使其速度提高了50%.

  • @coffeeaddict:实际上,.NET汇编不是在汇编中编译的.它们是用CIL字节码编译的,然后由.NET虚拟机解释.引用你的话,它们并不"需要汇编代码".实际上,根本没有涉及"汇编代码". (5认同)
  • @coffeeaddict:C#不强制执行OOP,VB.NET不强制执行OOP,Java不强制执行OOP.我可以简单地让一个类具有一堆函数并且基本上具有过程代码(或者在VB.NET的情况下,你甚至可以有一个模块).作为程序员,您必须决定构建程序的方式.没有编程语言可以强制你.而且它编译成汇编或字节码这一事实并没有改变任何东西. (3认同)
  • @coffeeaddict:完全没有.汇编代码基本上是纯处理指令直接发送到CPU.程序集依赖于平台和体系结构.CIL字节码(或任何字节码)是一组用于虚拟机的指令,然后基于主平台和体系结构向CPU发送适当的指令.因此,可以在多个平台上部署相同的二进制文件而无需任何更改(除了依赖项).这也是一个.NET二进制文件可以同时针对x86和x64的原因,但是C++程序(在汇编中编译)需要两个单独的二进制文件. (2认同)
  • 这是修辞吗?PHP根本没有强制执行 - 类型,OOP,你有什么. (2认同)
  • 继续这一点,PHP的问题不是语言本身.这是大多数使用它的程序员的低教育,这使得语言声名狼借.PHP的大部分书都非常糟糕.网络上的大部分例子都是如此.PHP中一个好的结构化站点可以像ASP.NET中的一个好的结构化站点一样面向对象. (2认同)
  • @coffeeaddict:强类型或弱类型不会使语言不那么面向对象.我开始有一种独特的感觉,你问这个问题,开始一场战斗.**PHP支持OOP的所有原则,因此是一种面向对象的语言.**C#并不妨碍我创建一个完全程序化的应用程序.Java也不是.我可以在C#和Java中创建`structs`,而不是创建对象和类.在PHP中,我可以使用数组而不是对象和类.程序员可以使用他选择的语言使用OO功能. (2认同)
  • 有趣的是,即使你看到"不是面向对象",Hiphop仍然支持PHP的弱类型. (2认同)

And*_*ore 6

PHP现在是一种完全面向对象的语言,即使大部分API都不是.

  • 它支持类和对象.
  • 它遵循OOP(继承,封装,抽象,多态)的原则

因此它是一种完全面向对象的语言.


PHP实际上编译(默认情况下在每次运行时除非使用"加速器")将其脚本编译为中间字节代码,然后由Zend Engine运行.

它实际上非常接近其他语言:

  • VB.NET/C#/ F#/其他.NET语言
    编译时这些语言不会在汇编代码中输出二进制文件,而是在通用中间语言(CIL)中输出二进制文件.然后,.NET虚拟机在运行时解释CIL字节码.

  • Java
    Java编译.class.jar文件不是汇编代码,而是Java Bytecode.然后,Java虚拟机在运行时解释Java字节码

  • PHP
    PHP编译成Zend Bytecode,然后由Zend Engine在运行时解释.