将过程步骤保存到全局变量

时间:2017-02-01 09:09:07

标签: php

我知道将一些类数据存储到全局变量是一个坏主意,原因有很多。

如果我有一个庞大的代码,我想为许多类记录一些进程并且不想使用某些创建的文件,该怎么办。

我的方法

$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);

我知道这远非最佳。 什么解决方案是最佳做法?

2 个答案:

答案 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();