在PHP中,(与我原先的想法不同),调用静态方法与简单函数的开销很大.
在一个非常简单的工作台上,开销超过调用时间的30%(该方法只返回参数):
// bench static method
$starttime = microtime(true);
for ($i = 0; $i< 10*1000*1000; $i++)
SomeClass::doTest($i);
echo "Static Time: " , (microtime(true)-$starttime) , " ms\n";
// bench object method
$starttime = microtime(true);
for ($i = 0; $i< 10*1000*1000; $i++)
$someObj->doTest($i);
echo "Object Time: " , (microtime(true)-$starttime) , " ms\n";
// bench function
$starttime = microtime(true);
for ($i = 0; $i< 10*1000*1000; $i++)
something_doTest($i);
echo "Function Time: " , (microtime(true)-$starttime) , " ms\n";
Run Code Online (Sandbox Code Playgroud)
输出:
Static Time: 0.640204906464 ms
Object Time: …
Run Code Online (Sandbox Code Playgroud) 阅读并接受单元测试,试图理解下面的帖子,解释了静态函数调用的艰辛.
我不清楚这个问题.我一直认为静态函数是一种在类中舍入实用函数的好方法.例如,我经常使用静态函数调用来初始化,即:
Init::loadConfig('settings.php');
Init::setErrorHandler(APP_MODE);
Init::loggingMode(APP_MODE);
// start loading app related objects ..
$app = new App();
Run Code Online (Sandbox Code Playgroud)
//阅读帖子后,我现在的目标是......
$init = new Init();
$init->loadConfig('settings.php');
$init->loggingMode(APP_MODE);
// etc ...
Run Code Online (Sandbox Code Playgroud)
但是,我为这堂课写的几十个测试是一样的.我什么都没改变,他们仍然都过去了.难道我做错了什么?
该职位的作者陈述如下:
静态方法的基本问题是它们是过程代码.我不知道如何对程序代码进行单元测试.单元测试假设我可以单独实例化我的应用程序.在实例化期间,我使用mocks/friendlies连接依赖项,这取代了真正的依赖项.使用程序编程没有任何"连线",因为没有对象,代码和数据是分开的.
现在,我从帖子中了解到静态方法创建了依赖关系,但是没有直观地理解为什么人们不能像常规方法那样容易地测试静态方法的返回值?
我将避免使用静态方法,但我想知道WHEN静态方法是否有用,如果有的话.从这篇文章看来,静态方法与全局变量一样邪恶,应尽可能避免.
关于该主题的任何其他信息或链接将不胜感激.
我有一些处理cookie的函数.通过将它们移动到自己的类并将它们用作静态方法来分组它们会是一个可怕的想法吗?
功能:
function cookie_get(){}
function cookie_set(){}
function cookie_delete(){}
Run Code Online (Sandbox Code Playgroud)
静态方法:
class cookie
{
static function get(){}
static function set(){}
static function delete(){}
}
Run Code Online (Sandbox Code Playgroud)