php - 以下PHP脚本的执行流程是什么?
问题描述
这是两个文件:
this_one.php
<?php
include_once("other_one.php");
$n1 = $_POST['name'];
$n2 = $_POST['password'];
echo "From this_one.php ".$n1." ".$n2."<br>";
?>
<form action="" method="POST">
<input type="text" name="name">
<input type="password" name="password">
<button type="submit" name="Submit">Login</button>
</form>
other_one.php
<?php
$name = $_POST['name'];
$pass = $_POST['password'];
echo "From other_one.php".$name." ".$pass."<br>";
?>
现在,当我在某处阅读时,如果表单操作为空,则 POST 将发送到脚本本身。other_one.php 也包含在文件 this_one.php 中
但是当我在浏览器中运行时,输出是:
From other_one.php hello pass
From this_one.php hello pass
一切如何运作?为什么会收到此输出?
PS:不要向我解释如何include_once
工作。我说的是,对于 10 个进程,脚本将从第 1 行一直运行到最后,如果我在包含的文件中打开与数据库的连接,这样我将创建相同的 $connection 实例 10 次,这将是一个开销。为所有这 10 个线程共享单个数据库实例的方法是什么?
解决方案
该include
指令将指定文件中的代码带入范围。从心理上讲,您可以将 include 指令替换为该文件中的代码块,实际上并没有什么区别。知道这一点,您的代码实际上是:
<?php
//include_once("other_one.php");
$name = $_POST['name'];
$pass = $_POST['password'];
echo "From other_one.php".$name." ".$pass."<br>";
$n1 = $_POST['name'];
$n2 = $_POST['password'];
echo "From this_one.php ".$n1." ".$n2."<br>";
?>
<form action="" method="POST">
<input type="text" name="name">
<input type="password" name="password">
<button type="submit" name="Submit">Login</button>
</form>
编辑
有四个指令可以将代码带入当前进程/请求的范围。在我命名它们之前,请注意我说的是当前流程/请求。如果有 10 个人点击您的登录页面,您将有 10 个进程/请求。同样,如果 1 个人点击您的登录页面 10 次,您也将有 10 个进程/请求。这就是 PHP 的本质,除非您真正注意到性能问题,否则我不会担心这一点。
这四个指令是include
、include_once
和。以保证提供的文件只被带入进程一次的指令结尾。其他两个指令允许每个进程多次包含一个文件。和之间的区别很微妙,但如果找不到文件,基本上会生成一个可忽略的警告,而会抛出一个致命错误。require
require_once
_once
include
require
include
require
一般来说,我个人始终建议您使用require_once
所有包含,除非您明确有理由多次引入代码。例如,如果您有一个分页器小部件需要位于表格的顶部和底部,则可以很好地使用多次包含同一个文件。我从来没有使用过,include
或者include_once
因为我无法想象包含问题对我来说是可以接受的情况。
另外,作为旁注,PHP 以一种可能令人惊讶的方式解析文件的路径。例如,如果您使用include 'file.php';
它实际上并不意味着将文件包含在当前目录中。相反,管理员可以设置一个可选的“包含路径”(就我而言,可能是出于遗留原因),并使用该语法首先搜索包含路径。如果您没有包含路径,或者在该路径中找不到该文件,则使用本地文件夹。出于这个原因,我建议始终包含使用“路径语义”的文件,这几乎可以归结为以句点或正斜杠或常量(例如__DIR__
.
推荐阅读
- listview - 向右拖动并删除
- java - 在 Azure 上使用 Maven for Hadoop 创建编译/.jar 疑难解答
- c# - ApplyConfigurationsFromAssembly 与过滤器实体框架核心
- antlr - ANTLR4。使用操作访问上下文对象
- sass - 如何覆盖引导程序 4 中的所有颜色?
- python - 使用 Django 处理来自输入字段或表单字段的输入
- css - iOS中的离子滚动位置
- javascript - 脚本在第一次单击时不起作用,仅在第二次单击
- ios - 如何在 SwiftUI 的 List 中设置和使用参数“selection”
- python - 如何根据中心将椭圆分成两半