我正在尝试创建一个包含所请求文件的函数。如果我需要/ 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();以我描述的方式运作。任何人都可以建议如何?
答案 0 :(得分:1)
您尝试做的是为您的功能创建一组可以打开或关闭的水平选项。一种常见的方法是使用按位数学。打开或关闭位是很容易的,这样我们就可以实现MYFILE_INCLUDE | MYFILE_ONCE
或MYFILE_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_once
或require_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);