如何使用php而不是OOP自动包含文件?
Posted
技术标签:
【中文标题】如何使用php而不是OOP自动包含文件?【英文标题】:How to auto include files with php not OOP? 【发布时间】:2012-01-13 00:41:25 【问题描述】:我有不同的模组,例如用户、统计等。如果我点击用户我会得到有关用户的信息,如果我点击统计我会得到用户统计等等。但我想用 php(不是 OOP)自动执行此操作 - 自动包含和调用 mods 文件夹中的文件(例如 users.php、statistics.php 等)。我知道 php OOP 具有自动加载类功能。但我不知道 PHP 面向对象。我如何在没有 OOP 的情况下使用 PHP 做到这一点? 我希望链接是这样的:
<a href='index.php?mod=users'>User list</a> <a href='index.php?mod=statistics'>Statistics</a>
【问题讨论】:
如果 $_GET["mod"] 是用户,您想自动包含 mods 文件夹中的所有文件,或者您想自动包含文件夹 mods 中的 users.php? @micha 如果 $_GET["mod"] 是用户,我想从文件夹 mods 中自动包含 users.php 【参考方案1】:if (isset($_GET["mod"]) && file_exists("mods/" . preg_replace("/[^\w\d]+/", "", $_GET["mod"]) . ".php"))
include "mods/" . preg_replace("/[^\w\d]+/", "", $_GET["mod"]) . ".php"; // or: require("mods/" . preg_replace("/[^\w\d]+/", "", $_GET["mod"]) . ".php");
【讨论】:
您需要清理输入。如果有人制作了一个 URL,其中 $_GET['mod'] 是 ../../../../../../../etc/passwd 或类似的怎么办?此外,include 和 require 之间的区别不仅仅是一个比另一个更现代。 @liquorvicar 如何清理输入? @EmilAzizov 在liquevicar 提醒我应该这样做之后,我直接清理输入。 @micha 我会推荐一种“白名单”风格的消毒方法。例如,OP 正在寻找包含 mods/NAME.php 形式的文件。因此,如果他的 php 只包含字母和下划线,我会删除除这些之外的所有字符。 如果你觉得更好,可以。【参考方案2】:使用switch
/case
或一些现代卫生系统。
// BASE_PATH is some previously defined application path constant
// fetch $mod from $_GET, and if set strtolower() it
switch($mod)
case 'user':
case 'admin':
case 'statistics':
$path = realpath(BASE_PATH . "/mods/$mod.php");
if(false === $path || !is_file($path))
// error, 404?
require $path;
break;
default:
// invalid mod, 404?
break;
// and so forth
【讨论】:
以上是关于如何使用php而不是OOP自动包含文件?的主要内容,如果未能解决你的问题,请参考以下文章