在条件(如果)内的要求(外部文件)中定义的 PHP7 const 正在工作 - 为啥?

Posted

技术标签:

【中文标题】在条件(如果)内的要求(外部文件)中定义的 PHP7 const 正在工作 - 为啥?【英文标题】:PHP7 const defined within a require (external file) within a conditional (if) is working - why?在条件(如果)内的要求(外部文件)中定义的 PHP7 const 正在工作 - 为什么? 【发布时间】:2021-05-17 02:01:09 【问题描述】:

在调试大量代码时,我遇到了与我的调试完全无关的以下内容。我确实花了很多时间在 Google 上寻找合理的解释:

constfunction、条件 (if)、require 中包含的外部文件的声明。 注意:这不是类结构的一部分!!

既然这个const 是在条件上下文中定义的,让它运行时? vs compile/parse-time,这应该(恕我直言)给出错误,但不仅没有错误,而且代码已经在生产中完美运行了三年多!

很想听听专家的解释,甚至是我明显遗漏的线索!

第一季度。为什么常量_DEFITEM不报错?

第二季度。为什么常量 _DEFITEM 工作,即使它不是使用 define 定义的?

在此先感谢您,尤其是 JS,感谢这个社区在过去十年中所做的出色工作!

参考

php Manual

If an include() is conditional, will PHP include the file even if the condition is not met?

https://wordpress.stackexchange.com/questions/143439/conditionally-include-files-in-functions-php

代码:简单的存根,带有一个被调用的函数,检查“SAVE”的值传递参数,有条件地包括(始终可用)保存模块文件,然后调用它的 main功能。包含的(需要)保存模块文件在顶部有 const 声明。

下面是人为但准确的代码表示!省略号代表其他代码

//  main_stub3.php     php file processing client request (included within a main page/script)
<?php
function list_view_save_proc_stub3 (fn_param1, fn_param2...)  
...
if ("VIEW" === fn_param2)  
   ...

else
if ("SAVE" === fn_param2)  
   ...
   require _INC . proj_save_module_file.php;           //  _INC is a global constant (path)
   sv_mod_fn ();

else
   ...
  //  END fn list_view_save_proc_stub3
//  END main_stub3.php


//  proj_save_module_file.inc   include file that contains a const declaration and a function
const _DEFITEM = [ 'it_id' => 0, 'it_name' => '', ... ];   //  about ~50 items in array

function sv_mod_fn ()  
//  some std error checking, building of a row, db connectivity and insertion +
//  message output to client
...

【问题讨论】:

我不太清楚是什么让你感到困惑,以及所有关于包含和条件的讨论如何结合在一起,但defineconst 语法的更好的手册页在这里:php.net/manual/en/language.constants.syntax.php 它似乎不在条件语句中,它在何处/何时定义并不重要。只要它还没有被宣布,它就会起作用。我真的没有看到任何令人困惑的事情。 @IMSoP - 我确实看过所有手册。特别是您的链接具体指向:Note: As opposed to defining constants using define(), constants defined using the const keyword must be declared at the top-level scope because they are defined at compile-time. This means that they cannot be declared inside functions, loops, if statements or try/ catch blocks. @Dave - 我的问题(可能是由于不正确的先入为主)是在编译时不包括外部文件,但仅在运行时,这表明在运行时我通常会得到一个常量声明错误。 啊,我想我明白你现在困惑的地方了,我会尽快整理一个答案。 【参考方案1】:

人们经常将 PHP 称为“脚本”甚至“解释”语言,但与大多数现代语言一样,它确实具有不同的 编译执行 步骤。很多细节通常并不相关,但对于您在这里的误解至关重要。

PHP 在第一次需要文件时编译它们;它也可以(通过the OpCache extension)缓存这个编译的结果。重要的是,它总是一次编译一个文件,无论该文件如何使用。因此,在编译时发生的一切都基于仅查看单个文件即可知道的内容。

一旦一个文件被编译,它可以被执行任意次数(或者在同一个请求中,或者稍后通过从 OpCache 内存中获取它)。所以在执行时发生的所有事情都可以知道它正在运行的当前上下文的所有内容。

要理解你的代码,你只需要知道两件事:

const 在编译时评估 require 在执行时评估

手册说const 不能在条件中使用时的意思是,当编译文件时,定义无条件地成为编译代码的一部分。该文件所属的每个程序都将包含该常量定义。这与define 不同,后者的编译有点像函数调用——它变成了一个标记,说“当你在程序执行到这一点时,定义这个常量”。

但是,编译文件并不会使其成为您程序的一部分。要真正使其成为您程序的一部分,您可以使用require(或其亲属),在执行时

只有在执行require 行时,该编译文件才会成为您正在运行的程序的一部分。它可能会及时编译以执行,或者从几小时前编译的 OpCache 中获取,但无论哪种方式,它只有在实际达到 require 时才执行require 可以是可选的,因此您可能会决定根据星期几、随机或根据用户输入来包含不同的文件。

就 PHP 而言,const 定义无条件编译成一个代码单元,有条件地包含在您的程序中

【讨论】:

谢谢。这就是我的理论,但无法真正找到任何明确的文章来支持它。欣赏你的努力。再次感谢!

以上是关于在条件(如果)内的要求(外部文件)中定义的 PHP7 const 正在工作 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 将文本附加到特定标签内的外部 html 文件?

CAD外部参照文件的分解

CAD外部参照文件的分解

PHP内的包含语句(include(),require(),include_once(),require_once())

如何在 php 页面中显示 XML 外部实体?

PHP 在函数中包含/要求