我知道将一些类数据存储到全局变量是一个坏主意,原因有很多。
如果我有一个庞大的代码,我想为许多类记录一些进程并且不想使用某些创建的文件,该怎么办。
我的方法
$log = [];
addLog($t) {
global $log[] = $t;
}
class Foo
{
function doStuff()
{
/// some stuff
addLog('diong stuff')
}
}
class Foo2
{
function doStuff()
{
/// some stuff
addLog('doing some other stuff')
}
}
$Foo = new Foo();
$Foo2 = new Foo2();
$Foo->doStuff();
$Foo2->doStuff();
$Foo->doStuff();
$Foo2->doStuff();
/// at the end i hve 20MB of $log datas to work with
print_r($log);
我知道这远非最佳。 什么解决方案是最佳做法?
答案 0 :(得分:2)
我建议你有一个单独的记录器类,它给需要通过依赖注入记录的对象。
以下是基于您的代码的基本示例:https://3v4l.org/0WpGZ
我想说一个好的做法是不要有可变的静态变量。如果您要为代码编写单元测试,静态变量最终会变得很痛苦。
答案 1 :(得分:1)
使用satic Class在代码中的任何位置调用它。
我添加了一个限制计数器,以便在达到此限制时刷新日志堆栈。 将其设置为0可禁用此功能。
<?php
class LogStack{
static $maxLogs = 1000;
static $logsCount = 0;
static $stack = [];
public static function addLog($log, $tag = "log"){
$stack[$tag][] = $log;
if(static::$maxLogs !== 0 && (++static::$logsCount) == static::$maxLogs){
//Save your logs
static::saveLogs();
}
}
public static function saveLogs(){
//Save logs on your persistent storage
//Dont forget to empty the stack and reset the counter
//static::$logs = [];
//static $logsCount = 0;
}
}
class Foo
{
function doStuff()
{
/// will save in default logs (log tag)
$this->addLog('diong stuff');
}
}
class Foo2
{
function doStuff()
{
/// will save in foo2 logs (foo2 tag)
LogStack::addLog('doing some other stuff', 'foo2');
}
}
并且,在脚本的最后,调用保存方法来保存剩余的日志
<?php
LogStack::saveLogs();