如果include()是有条件的,即使条件不满足,PHP也会包含该文件吗?

时间:2013-02-06 10:46:55

标签: php

这已经有很长一段时间了,我想我应该寻求专家的回答。 我想知道通过单个文件汇集所有PHP请求是否是一种糟糕的编程技术。我一直在网站上工作,不确定它是否会随着增长而扩展,因为我不是100%确定PHP如何处理include()函数。

为了更好地解释我如何构建我的准框架,这是我的根.htaccess文件的片段:

# > Standard Settings
RewriteEngine On

# Ignore all media requests
RewriteRule ^media/ - [L]

# Funnel all requests into model
RewriteRule ^(.*)$ _model.php [QSA]

因此,除了媒体目录中的内容之外的所有内容都会传递到此单个脚本中。

_model.php内部,我将所有输入消毒,用户认证,会话数据从数据库中拉出,设置了任何全局变量(常用变量,如$ longTime,$ longIP等...)。通过解释$_SERVER["REQUEST_URI"]变量来路由请求。

基本上我有一个switch()语句,它选择include()的模块。我不明白的是:当PHP执行时,无论case指令是否为真,它都会执行每一个include()吗?

我担心一段时间后我会有很多这些模块 - 如果PHP在运行时包含所有模块,它最终会占用太多的处理能力和RAM ......

-

编辑:
我真的只是问PHP是否会“读取”它可能必须包含的所有文件。我知道它实际上不应该执行代码。 如果我的include()之一是2GB文件需要很长时间才能处理,那么PHP会在执行之前一直读取该文件吗?

- 编辑:
我发现了另一个类似的问题(我在发布这个问题之前做了很多搜索) PHP behavior of include/require inside conditional

我想我可以关闭它。

2 个答案:

答案 0 :(得分:2)

不,PHP将在到达代码片段时执行include。

这非常重要,因为你可以直接使用包含代码的php include文件。 E.g。

File1中:

<?php echo "Foo"; ?>

文件2:

<?php
  echo "Before";
  include("File1");
  echo "After";
?>

有时您的PHP处理器甚至不知道在编译时要包含哪个文件。想象一下include("File".mt_rand(1,10));之类的东西。 PHP不知道要包含的文件名,直到它到达include语句。

答案 1 :(得分:2)

  

即使条件不满足,PHP也会包含该文件吗?

不,includerequire语句的解释和评估方式与其他PHP语句相同。在执行之前,PHP不会扫描包含的脚本。

这可以通过简单的测试来验证:

if(false)
{
    include('does_not_exist.php');
}

以上不会产生任何错误或警告。如果在执行之前读取了包含,您会看到如下警告:

  

警告:include(does_not_exist.php):无法打开流:没有这样的文件或目录...

     

警告:include():无法打开'does_not_exist.php'以包含...