如何解决PHP7 const 在条件if中的 require外部文件中定义正在工作 - 为什么?
在调试大量代码时,我遇到了以下与我的调试完全无关的问题。我确实花了过多的时间在 Google 上搜索合理的解释:
在 const
内、在条件 (function
) 内、在包含的外部文件的 if
内声明 require
。
注意:这不是定义为类结构的一部分!!
既然这个 const
是在条件的上下文中定义的,让它运行时? vs 编译/解析时,这应该(恕我直言)给出了错误,但不仅没有错误,而且代码已经在生产环境中完美运行了三年多!
很想听听专家的解释,甚至是我明显遗漏的线索!
第一季度。为什么常量 _DEFITEM 不报错?
第二季度。为什么即使未使用 define
定义常量 _DEFITEM 也能工作?
在此先感谢您,特别是感谢 JS,以及该社区在过去十年中所做的出色工作!
参考:
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
CODE:带有被调用函数的简单存根,检查“SAVE”的传值参数,有条件地包括(始终可用)保存模块文件,然后调用其主要功能。包含的(需要)保存模块文件在顶部有 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
...
}
解决方法
人们经常将 PHP 称为“脚本”甚至“解释”语言,但与大多数现代语言一样,它确实具有不同的编译和执行步骤。许多细节通常并不相关,但对您在这里的误解至关重要。
PHP 在第一次需要时编译文件;它也可以(通过 the OpCache extension)缓存这个编译的结果。重要的是,它总是一次编译一个文件,无论该文件如何使用。因此,在编译时发生的一切都基于仅查看该单个文件就可以知道的内容。
一旦文件被编译,它可以被执行任意次数(在同一个请求中,或者稍后从 OpCache 内存中获取它)。因此,在执行时发生的所有事情都可以了解有关它正在运行的当前上下文的所有信息。
要理解你的代码,你只需要知道两件事:
-
const
在编译时求值 -
require
在执行时求值
手册中说 const
不能在条件中使用的意思是,当编译文件时,定义无条件地成为编译代码的一部分。该文件所属的每个程序都将包含该常量定义。这与 define
不同,require
的编译有点像函数调用——它变成了一个标记,说“当你到达程序执行的这一点时,定义这个常量”。
但是,编译该文件并不会使其成为您程序的一部分。要使其成为程序的一部分,您可以在执行时使用 require
(或其亲属)。
只有在执行 require
行时,编译后的文件才会成为您正在运行的程序的一部分。它可能会及时编译以执行,或者从几个小时前编译的 OpCache 中获取,但无论哪种方式,它都只有在实际达到 require
时才执行。 const
可以是可选的,因此您可以根据星期几、随机或根据用户输入决定包含不同的文件。
就 PHP 而言,Sub DeleteRow()
Dim r As Long
Dim FirstRow As Long
Dim LastRow As Long
FirstRow = 3
LastRow = Cells(Rows.Count,"B").End(xlUp).Row - 1
For r = LastRow To FirstRow Step -1
If Cells(r,"B") = 0 Then
Rows(r).Delete
End If
Next r
End Sub
定义被无条件编译成一个代码单元,有条件地包含在您的程序中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。