2016-08-25 72 views
-2

我想创建一个函数来包含请求的文件。我想这个函数来听,如果我需要/ require_once,包括/ 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

第二个参数中的switch/case'? – Darren

+0

为什么你不能只使用require_once(“文件名”)? – Forbs

+0

使用** spl-autoload-register **。这里有很多指导。这真的很好用。 –

回答

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

这对初学者有很大的帮助,但是我想定义myFile()的功能。在你的情况下包括。但我希望函数能够反应它的包含或需求。所以如果我写myFile(HEADER,RQ)ir需要。如果我写myFile(HEADER,INC),它包括。 –

+0

我已更新我的答案,以使用不同函数名称的数组进行调用。 – Barmar

+0

好吧,我尝试使用myFile(HEADER,INC);并且我得到错误调用未定义的函数include() –

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_oncerequire_once一个函数内通常是没用的。这些结构将使用范围考虑在内。因此,当您使用同一个文件调用该函数两次时,include_once 'somefile.php'不起作用。该文件只包含在该功能的范围内。一旦函数返回,就好像该文件从未包含在那里一样。

如果你的用例是特定的,而不是试图替换包含/ require结构比这可能是好的,考虑到这一点,但否则它不会做你想做的。

盐警告

但粮食,而这可能看起来方便起初,我强烈反对使这一惯常做法,因为它是看似方便的意见。函数应该有一个目的。当你开始写很多这样的函数时,它开始看起来像你的功能只是做了太多。

+0

经过测试,无法正常工作。包括两次,即使我设置myfile('somefile.php',MYFILE_INCLUDE | MYFILE_ONCE) –

+0

不,它工作正常。它可能不会做你期望的,因为你正在做一个函数内的包含。包含/需要结构在PHP中作为语言结构而不是作为函数存在的主要原因之一,特别是因为它们考虑了范围。你可能想[参考文档](http://php.net/include)了解这些构造是如何工作的,以及为什么试图尝试用自定义函数来替换它们是徒劳的。 – Sherif