如何使用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自动包含文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP OOP 插入多个单选按钮值

PHP面向对象的工具

如何使用 OOP 将 $db 从另一个 .php 使用到另一个 .php 的类?

用 AJAX、MVC 实现 OOP PHP?

php面向对象编程(oop)基础知识

php 判断是不是包含