我不想仅仅编写一个名为import()的新函数,而是想知道是否有更好的解决方案。否则require_once将仅包含在import()的范围内,这对于那里的任何“全局”变量都是不好的。
我的import()函数与require_once的工作方式不同,但用途相同(增强的可用性)。
答案 0 :(得分:6)
我的直觉意见:不。不要这样做。
语言具有其原生功能集。为什么要引入没有附加价值的专有功能。
我认为没有理由被require_once()
吓跑。
我同意你的观点,使用全局变量并不是一件好事,但是牺牲将它们用作虚荣函数名称的可能性并不是一个好方法。
如果路径是您所担心的,那么为什么不编写一个返回正确路径的import()
函数。像这样:
require_once import("operations.php");
唯一 - 在我看来并不那么可怕 - 缺点是你只需要确保导入总是返回某些东西的正确路径,否则require_once
会崩溃。除此之外,它具有相同的舒适度,允许您根据需要控制路径,但在灵活性方面不会花费任何成本。
答案 1 :(得分:2)
我不了解你和你的团队,但我从来没有遇到过一个PHP开发人员“被吓到”的必需/包括 - 这就是语言的工作方式。
如果你被这些事情吓跑了,也许你应该使用另一种语言。
你提出的建议听起来像是维护噩梦。
答案 2 :(得分:0)
使用__autoload()
可能会得到与您所追求的相似的内容。然后你就可以使用你想要的任何类,而不用require
它,只要它的文件在你的include_path中就可以毫无问题地加载它。
(这当然假设您尝试包含的文件中包含一个类,并且该类及其文件是根据某些约定命名的。可能不是实际上就是这种情况。)
这是一款非常标准的自动加载器,适用于Zend和Pear风格的命名约定:
<?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'.");
}
}
?>
答案 3 :(得分:-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源代码。