PHP编译时与运行时。理解差异

PHP编译时与运行时。理解差异,php,Php,我经常听到这两个术语,并不断思考 PHP中编译时和运行时的区别是什么 我试过读一些文章,但没用 有人知道一个简单的解释吗?它们之间有什么不同 PHP在任何时候运行一个文件都会进行两次传递(默认情况下) Pass#1解析文件并生成所谓的操作(或机器)代码。这是您的计算机实际运行的原始二进制格式,它不是人类可读的。在其他语言(如C++等)中,这称为编译。您可以使用各种系统(如)缓存此步骤,这样可以节省每次编译此步骤的开销 语法错误来自执行的这一部分 Pass#2执行Pass#1中的操作代码。这就是通

我经常听到这两个术语,并不断思考

PHP中编译时和运行时的区别是什么

我试过读一些文章,但没用

有人知道一个简单的解释吗?它们之间有什么不同

PHP在任何时候运行一个文件都会进行两次传递(默认情况下)

Pass#1解析文件并生成所谓的操作(或机器)代码。这是您的计算机实际运行的原始二进制格式,它不是人类可读的。在其他语言(如C++等)中,这称为编译。您可以使用各种系统(如)缓存此步骤,这样可以节省每次编译此步骤的开销

语法错误来自执行的这一部分

Pass#2执行Pass#1中的操作代码。这就是通常所说的“运行时”,因为您的计算机实际上正在执行指令


运行时错误(如内存耗尽、异常终止等)来自此级别。但是,这些错误比语法错误要少见得多。

PHP文件分两个阶段运行

首先,解析PHP文件。此时,来自web浏览器(或任何其他来源)的数据是完全无关的。所有这些都是将PHP文件分解为其组成部分并构建代码结构

然后使用您提供的数据执行代码

这种分离使代码速度大大加快。当您拥有像APC或OPcache这样的操作码缓存时,尤其如此,因为第一步可以在后续情况下跳过,因为代码的结构完全相同

你遇到差异的时间主要是错误。例如,此代码将在编译阶段导致错误:

function class() {
    // some code
}
这是不可能的,因为
class
是保留字。PHP可以在编译代码时发现这一点:它总是会失败。它永远不会起作用

但是,此代码可能会在运行时导致错误:

echo $_GET['nonExistingKey'];

由于键
不存在键
不存在,因此无法检索,因此会导致错误。但是,PHP无法在最初编译代码时确定这一点,只有在使用您提供的数据运行代码时才能确定这一点。

编译时间是脚本文件加载到内存并进行标记化的时间(如果您使用的是操作码缓存,这是首次请求脚本时的一次性练习);运行时是当代码实际执行时,HP是一种解释语言,因此它的工作方式与C++非常不同,正如其他两个回复所述,PHP是一种解释语言。用lamens的术语来说,这意味着可以将原始
.php
文件加载到php引擎(webserver/任何东西)中,然后执行这些文件。其他语言,如java、C++、C++等都是编译的。这意味着原始文件实际上并没有加载到应用程序中,而是由编译器读取这些文件并生成可执行文件。那么,某些代码如何在编译时运行,而其他代码如何在运行时运行?根据您的描述,似乎所有代码在运行时是否抛出错误都取决于错误。编译时会发现语法错误。运行时错误(如进程耗尽分配的内存)将从运行时抛出。我认为这将有助于: