而不是只写一个名为import()的新函数,我想知道是否有更好的解决方案。否则,require_once将仅包含在import()的范围内,这对任何“全局”变量都是不利的。重新命名require_once函数的策略?
我的import()函数的工作方式与require_once不同,但是起到了相同的作用(增强了可用性)。
而不是只写一个名为import()的新函数,我想知道是否有更好的解决方案。否则,require_once将仅包含在import()的范围内,这对任何“全局”变量都是不利的。重新命名require_once函数的策略?
我的import()函数的工作方式与require_once不同,但是起到了相同的作用(增强了可用性)。
我的直觉意见:Nah。不要这样做。
语言具有其原生的一组功能。为什么要引入没有附加价值的专有功能。我不认为有理由被require_once()
吓跑。
我同意你的观点,使用全局变量不是一件好事,但牺牲使用它们作为虚荣函数名称的可能性并不是一个好的方法。
如果路径是什么,你很担心,那么为什么不写一个import()
函数返回正确路径。像这样:
require_once import("operations.php");
唯一的 - 在我眼里没有那么可怕 - 缺点是,你只需要确保进口总是返回正确路径东西,否则require_once
会崩溃。除此之外,它具有相同的舒适性,可以让您根据自己的意愿控制路径,但在灵活性方面不会让您花费任何代价。
这是一个很好的解决方案。谢谢。 – openfrog 2009-12-31 23:36:23
我不了解你和你的团队,但我从来没有遇到PHP开发人员被require/include“吓跑” - 这只是语言的工作方式。
如果你被这样的事情吓倒了,也许你应该使用另一种语言。
而你提出的建议听起来像是一个维修噩梦。
你不应该把事情看得太严重;)我说每次都必须考虑路径,所以我简化了它。我相信,让生活更轻松没有错。 – openfrog 2009-12-31 23:37:41
通过创建导入函数并将其附加到类,可以减少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源代码。
通过使用__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'.");
}
}
?>
这是一个新的。我从来没有听说过一个库函数的可用性问题,它简单地通过名字吓跑了开发人员。当你在它的时候,考虑去掉strip *(),chop(),explode(),implode(),die()以及其他伪暴力探测函数。它在哪里结束? – 2009-12-31 22:19:39
让事情变得简单没有错。 – openfrog 2009-12-31 22:55:50