创建我自己的文件包含功能

时间:2016-08-25 00:07:52

标签: php

我正在尝试创建一个包含所请求文件的函数。如果我需要/ require_once,include / include_once

,我希望该函数能够监听

所以它看起来像

<?php
myFile(FILE, REQO); // REQO meaning require_once
?>

到目前为止,我已经创建了包含文件的函数:

define("HEADER", "header.php");
define("FOOTER", "footer.php");

function myFile($file) {
    if (file_exists($file)) {
        include $file;
    } else {
        die($file." does not exit");
    }
    return $file;
}

所以当我在“模板”文件中使用此功能时

<?php
myFile(HEADER);
echo "some text";
myFile(FOOTER);
?>

它工作正常,但我想扩展myFile();以我描述的方式运作。任何人都可以建议如何?

2 个答案:

答案 0 :(得分:1)

您尝试做的是为您的功能创建一组可以打开或关闭的水平选项。一种常见的方法是使用按位数学。打开或关闭位是很容易的,这样我们就可以实现MYFILE_INCLUDE | MYFILE_ONCEMYFILE_REQUIRE | MYFILE_ONCE之类的东西。

这是一个简单的例子。

const MYFILE_ONCE = 1;
const MYFILE_INCLUDE = 2;
const MYFILE_REQUIRE = 4;

function myFile($file, $opt = MYFILE_INCLUDE) {
    if (($opt & MYFILE_INCLUDE) === MYFILE_INCLUDE) { // include
        if (($opt && MYFILE_ONCE) === MYFILE_ONCE) { // once
            include_once $file;
        } else {
            include $file;
        }
    } elseif (($opt & MYFILE_REQUIRE) === MYFILE_REQUIRE) { // require
        if (($opt && MYFILE_ONCE) === MYFILE_ONCE) { // once
            require_once $file;
        } else {
            require $file;
        }
    }
}

现在,您可以像这样调用您的函数来包含文件myfile('somefile.php', MYFILE_INCLUDE),或者像这样包含一次myfile('somefile.php', MYFILE_INCLUDE | MYFILE_ONCE)。与要求相同。

范围说明

非常清楚,当您使用该函数尝试替换include / require构造时,在函数内部执行include_oncerequire_once通常是无用的。构造将范围考虑在使用它们的位置。因此,当您使用相同的文件调用该函数两次时,include_once 'somefile.php'无效。该文件仅包含在该函数的范围内。一旦函数返回它,就好像文件从未包含在那里一样。

如果您的用例是特定的并且没有尝试替换include / require构造,那么这可能没问题,考虑到这一点,但是否则它不会做你想要的

盐味警告

然而,虽然这看起来似乎很方便,但我强烈反对将其作为常规练习,因为它看似方便。功能应该用于单一目的。你开始写这么多功能的那一刻开始看起来你的功能就是做得太多了。

答案 1 :(得分:0)

使用switch声明。

define('INC', 0);
define('INCO', 1);
define('REQ', 2);
define('REQO', 3);

function myFile($file, $type = INC) {
    if (file_exists($file)) {
        switch ($type) {
            case INC: include $file; break;
            CASE INCO: include_once $file; break;
            CASE REQ: require $file; break;
            CASE REQO: require_once $file; break;
            default: die('Bad $type: ' . $type);
        }
    } else {
        die("$file does not exist");
    }
    return $file;
}

然后你可以写:

myFile(HEADER, true);

表示“曾经”版本。

如果你真的想使用参数REQO,你可以这样做:

define('REQO', true);