2009-12-31 75 views
0

而不是只写一个名为import()的新函数,我想知道是否有更好的解决方案。否则,require_once将仅包含在import()的范围内,这对任何“全局”变量都是不利的。重新命名require_once函数的策略?

我的import()函数的工作方式与require_once不同,但是起到了相同的作用(增强了可用性)。

+1

这是一个新的。我从来没有听说过一个库函数的可用性问题,它简单地通过名字吓跑了开发人员。当你在它的时候,考虑去掉strip *(),chop(),explode(),implode(),die()以及其他伪暴力探测函数。它在哪里结束? – 2009-12-31 22:19:39

+0

让事情变得简单没有错。 – openfrog 2009-12-31 22:55:50

回答

6

我的直觉意见:Nah。不要这样做。

  • 语言具有其原生的一组功能。为什么要引入没有附加价值的专有功能。我不认为有理由被require_once()吓跑。

  • 我同意你的观点,使用全局变量不是一件好事,但牺牲使用它们作为虚荣函数名称的可能性并不是一个好的方法。

如果路径是什么,你很担心,那么为什么不写一个import()函数返回正确路径。像这样:

require_once import("operations.php"); 

唯一的 - 在我眼里没有那么可怕 - 缺点是,你只需要确保进口总是返回正确路径东西,否则require_once会崩溃。除此之外,它具有相同的舒适性,可以让您根据自己的意愿控制路径,但在灵活性方面不会让您花费任何代价。

+0

这是一个很好的解决方案。谢谢。 – openfrog 2009-12-31 23:36:23

2

我不了解你和你的团队,但我从来没有遇到PHP开发人员被require/include“吓跑” - 这只是语言的工作方式。

如果你被这样的事情吓倒了,也许你应该使用另一种语言。

而你提出的建议听起来像是一个维修噩梦。

+0

你不应该把事情看得太严重;)我说每次都必须考虑路径,所以我简化了它。我相信,让生活更轻松没有错。 – openfrog 2009-12-31 23:37:41

-1

通过创建导入函数并将其附加到类,可以减少require调用的数量。因此,在需要框架一次后,用户就可以使用导入功能来包含其他框架类。即:

的index.php:

require_once 'MyFramework.php'; 
MyFramework::import('Path/To/File.php'); 

MyFramework.php

class MyFramework { 
static function import($path) { 
    // code to include/import the path 
} 
} 

另一种选择是使用PHP的一个auto_load语义自动require框架类:

http://php.net/manual/en/language.oop5.autoload.php

虽然在在一天结束之前,您无法真正替换require/include语句,而无法编辑PHP源代码。

0

通过使用__autoload(),您可能会得到与您之后的内容相似的内容。然后你可以使用你想要的任何类,而不需要require,只要它的文件在你的include_path中,它将被加载而没有麻烦。

(当然,这假设你想包含的文件中有一个类,这个类和它的文件被命名为根据一些约定。也许这就是其实并非如此。)

这是一个非常标准的自动加载,与Zend-和梨风格的命名约定的工作原理:

<?php 
/** 
* Load (include the file of) a given PHP class. 
* 
* @param string $class The name of the class to load. 
* 
* @return void 
*/ 

function __autoload($class) 
{ 
    $files = array(
     $class . '.php', 
     str_replace('_', '/', $class) . '.php', 
    ); 
    foreach (explode(PATH_SEPARATOR, ini_get('include_path')) as $base_path) { 
     foreach ($files as $file) { 
      $path = "$base_path/$file"; 
      if (file_exists($path) && is_readable($path)) { 
       include_once $path; 
       $finalPath = $path; 
      } 
     } 
    } 
    if (isset($finalPath)) { 
     return; 
    } else { 
     die("Unable to load class '$class'."); 
    } 
} 
?>