更好地管理功能之间的“消息”?

时间:2011-04-01 22:26:42

标签: php frameworks

我的框架我有一些功能,完成后可以将一些消息添加到队列中进行报告。

示例:我有一个采用照片路径和

的功能
  • 如果图片不是.jpg,则将其转换为.jpg
  • 如果图像大于500kB,则会缩小其尺寸

我有一个全局$msgQueue=array();,每当页面的所有逻辑都完成后,在我的模板中,我向用户回复所有报告(函数可以在exectuion期间添加)。

在这种情况下,2条消息将被添加到$ msgQueue:

  • 图片为PNG,已转换为JPG
  • 图像为2000x1000,现在为1000x500

但这种行为我觉得它不标准。如果我想与某人共享我的一个函数(在这种情况下是checkImage($path))它无法工作,因为函数需要全局数组来放置它们的报告信息。

是否有一种标准方法可以解决这个问题,以便我可以与其他人分享我的功能,而不用担心这种依赖性?

3 个答案:

答案 0 :(得分:0)

我的建议是使用类,如:

class Report(){
    public $msgQueue;

    function addReport($string){ 
         array_push($this->msgQueue, $string);  //store new report
    }

    function showReports(){
         //loop over the message queue
         ...
    }
}

<强>优点:

  1. 您可以使用同一个类使用不同类型的报告,将流程与错误分开,例如$processes = new Report$errors = new Report

  2. 无需将vars声明为全局变量,该类保留其属性$msgQueue的值,您只需要$processes->addReport("Resizing image to XXX")

  3. OOP的好处,具有逻辑结构等。

答案 1 :(得分:0)

我真的不认为有标准方法。我这样做是:

  • 为每个库(图像,文件等)提供自己的消息数组。

  • 使用具有自己的消息数组的消息库以及可以通过Message::addSource($class, $propertyName)构建/添加的“源”数组。 (我在创建库的实例后立即添加消息源,例如Image。)

    • 当执行Message :: render()时,它会将每个源的消息与 Message 类自己的消息组合在一起然后呈现它们。

这样做可以使每个库独立于其他库,同时仍然可以同时拥有每个实例和全局消息数组。

答案 2 :(得分:0)

  

是否有标准方法可以解决   此?

是的,它名为OOP :)(请参阅amosrivera的答案)。

但是如果OOP不是一个选项(但你应该认真考虑它),那么重构函数以接受messageQueue参数(并通过引用传递)可能会有效。

// passing $messageQueue by reference by prepending &
function checkImage( $path, array &$messageQueue = null )
{
    /* do image checking */
    $result = /* the result of the image checking */;

    // if $messageQueue argument is provided
    if( $messageQueue !== null )
    {
        // add the message to the queue
        $messageQueue[] = 'Image checking done';
    }

    return $result; // false or true perhaps.
}

用法:

$messageQueue = array();

if( checkImage( $somePath, $messageQueue ) )
{
    echo 'checking image succeeded';
}
else
{
    echo 'checking image failed';
}

var_dump( $messageQueue );

// would output something like:
Array(1) (
    'Image checking done'
)