我有一个需要包含文件的函数,但是这个函数在200到300次的地方使用,这显然会导致效率问题,有没有办法在函数内部优化这个? (我知道有很多方法可以解决这个问题,但这会对整个应用程序产生太大的影响)
我只想举一个例子,这不是整个功能。
function getString(arrayName, strValue){
inclue('stringArrays.php');
return $$arrayName[strValue];
}
我尝试过使用include_once,但这也不起作用。
提前致谢。
答案 0 :(得分:1)
您可以在函数中使用静态变量来保存您的值:
function getString($arrayName, $strValue){
static $string_arrays = array();
if (empty($string_arrays)) {
include('stringArrays.php');
$string_arrays = array_diff_key(get_defined_vars(), array(
'string_arrays' => true,
'arrayName' => true,
'strValue' => true,
));
}
return $string_arrays[$arrayName][$strValue];
}
只应包含一次文件。
答案 1 :(得分:0)
你总是可以添加另一个参数,也许是一个布尔值来告诉函数是否包含它。
function getString(arrayName, strValue, includeFile)
{
if (includeFile)
{
inclue('stringArrays.php');
}
return $$arrayName[strValue];
}
答案 2 :(得分:0)
您可以尝试全局化stringArrays.php中的内容,以便在包含文件之前检查是否已设置该全局变量。很难说没有看到stringArrays.php中的结构。
答案 3 :(得分:0)
如果你的函数只是包含一个文件,你应该首先评估是否应该首先调用该函数,或者让函数确定是否需要包含。如果你真的不需要它,基本上不要盲目地包含文件。 include_once会导致性能下降。
答案 4 :(得分:0)
安装APC,eAccelerator,XCache或任何其他代码加速器,这样PHP每次调用时都不需要从磁盘检索包含文件。代码加速器将文件保存在共享内存中。这将显着提高性能。
答案 5 :(得分:0)
是否有什么阻止您将当前“数组”数组包装在数组中,然后通过引用将该包装器数组传递给该函数?然后,您可以在函数外部执行单个require / include。或者,您可以将一组数组和函数包装在一个对象中,再次将您带到一个require / include。
答案 6 :(得分:0)
如果stringArrays.php只是一个数组的集合,那么在构造函数中创建一个包含stringArrays.php的stringHandler单例并将每个数组映射到一个类属性,然后一个简单的方法来从该类中获取你想要的任何一个。然后你的getString()函数只是引用stringHandler中的getter方法。
<强> stringArrays.php 强>
<?php
$abc = array('def' => 'Hello',
'ghi' => ' '
);
$jkl = array('mno' => 'World',
'pqr' => '.'
);
?>
<强> stringHandler.php 强>
<?php
class stringHandler
{
private static $instance;
private function __construct()
{
include('stringArrays.php');
foreach(get_defined_vars() as $key => $val) {
$this->{$key} = $val;
}
}
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
public function getStringFromArray($arrayName, $strValue)
{
return $this->{$arrayName}[$strValue];
}
}
function getString($arrayName, $strValue){
return stringHandler::singleton()->getStringFromArray($arrayName, $strValue);
}
echo getString('abc','def');
echo getString('abc','ghi');
echo getString('jkl','mno');
?>
Kludgy,但不应该是一个很大的性能开销。