【问题标题】:The best way for loads of IF - ELSE - INCLUDE?IF - ELSE - INCLUDE 负载的最佳方式?
【发布时间】:2015-01-31 16:35:15
【问题描述】:
<?php
    if ($page == null || $page == "home")
        require_once ("home.php");
    else if ($page == "bill")
        require_once ("bill.php");
    else if ($page == "product")
        require_once ("product.php");
    else if ($page == "addproduct")
        require_once ("addproduct.php");
    else if ($page == "editpd")
        require_once ("editpd.php");

    /** ... MANY LINES ... **/

    else if ($page == "permission")
        require_once ("permission.php");
    else if ($page == "options")
        require_once ("option.php");
    else // NOT FOUND, REDIRECT HOME
        echo "SOMETHING WENT WRONG";
?>

上面的代码是IF ELSE and REQUIRE_ONCE的负载。

我在系统开发的时候就开始担心执行时间,这意味着我要写IF ELSE and REQUIRE_ONCE越来越多。

所以我真的很想知道,

如果不使用任何框架,有什么解决方案或更好的方法?

【问题讨论】:

  • 为什么不使用switch声明
  • @MMK:在这种情况下,switch 语句真的比IF ELSE 快吗?
  • 更好的方法是:创建一个包含所有页面名称的数组。 @Barmar 的回答真的很酷。你应该摆脱所有if else

标签: php


【解决方案1】:
if($page == NULL) {
    include 'home.php';
} else {
    include "$page.php";
}

【讨论】:

    【解决方案2】:

    看起来所有的包含文件都与$page同名,所以你可以使用字符串处理来删除所有重复的代码。

    $pages = array('home', 'bill', 'product', ...);
    $page = $page == null ? 'home' : $page;
    if (in_array($page, $pages)) {
        require_once ($page . ".php");
    }
    

    【讨论】:

    • “in_array()”在此解决方案中非常重要,因为它限制了允许加载的页面。否则你会得到一个安全漏洞,用户可以在你的服务器上 require_once 任何 php。
    【解决方案3】:

    您可以使用switch() 语句,如下所示:

    <?php
        switch($page) {
            case "home":
            case null:
                require_once ("home.php");
                break;
            case "bill":
                require_once ("bill.php");
                break;
            case "product":
                require_once ("product.php");
                break;
            case "addproduct":
                require_once ("addproduct.php");
                break;
            case "editpd":
                require_once ("editpd.php");
                break;
    
        /** ... MANY LINES ... **/
    
    
            case "permission":
                require_once ("permission.php");
                break;
            case "options":
                require_once ("option.php");
                break;
            default:
                echo "SOMETHING WENT WRONG";
                break:
        }
    ?>
    

    如果结构保持不变,也许这是一个更好的选择:

    if(is_null($page)) {
        $page = 'home';
    }
    if(file_exists($page . '.php')) {
        require_once($page . '.php');
    } else {
        echo "SOMETHING WENT WRONG";
    }
    

    【讨论】:

    • 请永远不要做第二个版本..... require_once 理解 ../ 路径,你可以用空字节结束 $page 以包含你想要的任何内容
    • @MichaelFreund 请解释完整的代码而不是其中的一行...这永远不会发生,因为file_exists() 函数找不到../.php 一个有效的文件名...
    • file_exists('../../../badfile' . '.php') 是绝对有效的,如果它存在的话......这是一个糟糕的 file_inclusion 泄漏,hakipedia.com/index.php/…
    • @MichaelFreund 如果您有安全问题,请按照以下步骤操作; 1. 在 PHP 上查找函数参考并阅读大红色轮廓部分 (php.net/file_exists)。 2. 谁说$page 是用户可以更改的?没有指定需要白名单,这不能从提出的问题中推断出来
    【解决方案4】:
    $page = preg_replace('/\W+/', '', $page); 
    if (is_file($page . '.php')) {
        require_once $page . '.php';
    }
    

    或加入白名单

    $whitelist = ['permission', '....'];
    if (in_array($page, $whitelist)) {
        require_once $page . '.php';
    }
    

    或为了提高性能

    $whitelist = ['permission' => true, '...' => true];
    if (isset($whitelist[$page])) {
        require_once $page . '.php';
    }
    

    【讨论】:

    • 顺便说一句:require_once 不是一个函数,它是一个语句,就像 echo ...所以不需要 ( and ) .... 你不应该使用它们
    • 不要使用没有白名单的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多