Php 创建我自己的文件包含函数

Php 创建我自己的文件包含函数,php,Php,我正在尝试创建一个函数来包含请求的文件。如果我需要/require\u一次,include/include\u一次,我希望该函数能够监听 所以看起来像是 <?php myFile(FILE, REQO); // REQO meaning require_once ?> 所以当我在我的“模板”文件中使用这个函数时 它工作正常,但我想扩展myFile();按我描述的方式运行。任何人都可以建议如何操作?使用开关语句 define('INC', 0); define('INCO', 1

我正在尝试创建一个函数来包含请求的文件。如果我需要/require\u一次,include/include\u一次,我希望该函数能够监听

所以看起来像是

<?php
myFile(FILE, REQO); // REQO meaning require_once
?>
所以当我在我的“模板”文件中使用这个函数时



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

使用
开关
语句

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);

您要做的是为您的函数创建一组水平选项,这些选项可以打开或关闭。一种常见的方法是使用位数学。例如,很容易打开或关闭位,这样我们就可以实现像
MYFILE\u INCLUDE | MYFILE\u ONCE
MYFILE\u REQUIRE | MYFILE\u 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\u include)
,或者像这样包含一次
myfile('somefile.php',myfile\u include | myfile\u once)
。要求也一样

范围的澄清 非常清楚地说,当您使用函数试图替换include/require构造时,在函数内部执行
include\u once
require\u once
通常是无用的。构造将作用域考虑到使用它们的位置。因此,
include_once'somefile.php'
在使用同一文件调用函数两次时无效。该文件仅包含在该函数的范围内。函数返回后,就好像文件从未包含在其中一样

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

盐粒警告
然而,虽然一开始这似乎很方便,但我强烈建议不要将其作为一种常规做法,因为这似乎很方便。职能应为单一目的服务。当你开始编写很多这样的函数时,你的函数似乎做得太多了。

switch/case
在你的第二个参数上?为什么不能只使用require_once(“文件名”)?使用spl自动加载寄存器。有很多关于这方面的指南。这对初学者很有帮助,但是我想定义myFile()的作用。在你的情况下,包括。但我想让函数做出反应,要么是include,要么是require。所以,如果我写我的文件(头,RQ),ir需要。若我写myFile(HEADER,INC),它包括。我已经更新了我的答案,以使用不同的函数名数组来调用。好的,我尝试使用myFile(HEADER,INC);我得到了对未定义函数include()的错误调用,很明显,
include()
不是一个真正的函数,它是PHP语法(我应该意识到这一点,因为您可以在参数周围不加括号的情况下使用它)。您必须使用
开关
语句。对此进行了测试,但无法正常工作。包含两次即使我设置了myfile('somefile.php',myfile_INCLUDE | myfile_ONCE)否,也可以正常工作。它可能不会达到您期望的效果,因为您正在函数内部执行include。include/require结构在PHP中作为语言结构而不是函数存在的主要原因之一就是它们考虑了作用域。您可能想了解这些构造是如何工作的,以及为什么尝试用自定义函数替换它们是徒劳的。
define('REQO', true);
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;
        }
    }
}