【问题标题】:how to exclude a file after including it in php?将文件包含在php中后如何排除它?
【发布时间】:2014-08-17 15:54:39
【问题描述】:

我们在Myfile.php 中添加一个文件后:

require_once 'abc.php';

include_once 'abc.php';

我们将如何删除文件?或者如何阻止abc.php文件内容在某段代码后被访问?

【问题讨论】:

  • 取决于文件中的内容。但一般来说,一旦你通过require_onceinclude_once 加载文件,它就在那里,你无法选择性地打开或关闭它。
  • 为什么?你的逻辑有问题。
  • 是的。如果不可能,我必须花费 2-3 个小时来更改我的代码。我有不同的文件,里面有一个类。但有些类具有相同的名称。所以如果我需要访问 2 个具有相同类的不同文件,它会抛出“类重新声明错误”。
  • 不应有同名的类。如果您无法避免它(在库之外),请使用名称空间:php.net/manual/en/language.namespaces.rationale.php
  • @AbraCadaver 哦,不。我实际上正在使用 Gas ORM,它正在创建表类。因此对于表名user_detailspayment_details,它将在user 文件夹和payment 文件夹中创建类,其中details.php 文件和类-details ..

标签: php require-once php-include


【解决方案1】:

在 PHP 中,一旦包含资源,就不能删除 或“取消包含”。这就是 PHP 文件包含的原则。见:http://www.php.net/manual/en/function.include.php

include 语句包含并评估指定的文件。

一旦解释器评估您的代码,工作就完成了。所有操作都已考虑在内,为了撤消更改,您必须执行相反的操作。例如,如果您包含的文件声明了类MyClass,那么您需要取消定义它,由于与上述相同的原因,这也是不可能的。请参阅:Unset Class

如果您的文件实际上添加了 functions 而不是 classes,那么从 PHP 5.3 开始,您可以使用 anonymous functions。这允许您将函数分配给可以unset 的变量。见this answer for details

如果您的代码逻辑的一部分必须在某个时候消失,那么您在实施之前没有花费足够的时间设计

如果您因为名称冲突而需要撤消包含,问题几乎相同。但是,这种情况下的解决方案是使用namespaces。不过,稍微回顾一下您的应用程序设计就足以避免此类冲突。

编辑框架:单个框架不能适用于每个应用程序。例如,Symfony 绝对在任何地方都使用名称空间来避免任何可能的冲突(然而,有些冲突会发生)。如果您的框架不能让您轻松区分两个同名模型类,那么我会说它不适合(至少不适合您的设计)。

【讨论】:

  • 如果您试图避免不必要的包含,您可以将 include 命令包含在条件中。假设 $x != TRUE,文件“thisFile_inc.php”将不会被加载或解析如下:if($x=TRUE){include("thisFile_inc.php);}.
【解决方案2】:

你不能。一旦加载就无法删除。

【讨论】:

  • 这是一条评论。没有答案。
  • @JakeGould 问题是how to... 答案是you can't。我相信这是对主要问题的直接回答。
  • @JakeGould 实际上是这样。 OP 要求的内容是不可能的,因此唯一正确的答案是“你不能”。其他任何事情都是关于玩语义或变通方法。然而,解释为什么将是一个很好的补充。
  • @JohnWHSmith 同样,这是一条评论。不是答案。它没有提供任何细节或解释。它也不承认从我们的角度来看,我们都不知道这些包含的文件中的确切内容是什么。作为评论,它是有效的。作为答案,它不是。
【解决方案3】:

有一个解决方法。您可以在打开输出缓冲时包含该文件。然后将输出保存到像$output 这样的变量中。需要就使用,否则直接unset($output)丢弃即可;

ob_start();
include('file.php'); 
$output = ob_get_contents();
ob_end_clean();

以后,当您不再需要它时,您可以使用unset($output)

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2016-03-20
    相关资源
    最近更新 更多