Php 更好地管理职能部门之间的“消息”?

Php 更好地管理职能部门之间的“消息”?,php,frameworks,Php,Frameworks,在我的框架中,我有一些函数,完成后,它们可以向队列中添加一些消息以进行报告 示例:我有一个函数,它获取一张照片的路径,然后 如果图像不是.jpg,则将其转换为.jpg 如果图像大于500kB,则会减小其大小 我有一个全局$msgQueue=array;每当页面的所有逻辑完成时,在我的模板中,我会向用户回显函数在执行过程中可以添加的所有报告 在这种情况下,将向$msgQueue添加2条消息: 该图像为PNG格式,已转换为JPG格式 图像是2000x1000,现在是1000x500 但是这种行为我认

在我的框架中,我有一些函数,完成后,它们可以向队列中添加一些消息以进行报告

示例:我有一个函数,它获取一张照片的路径,然后

如果图像不是.jpg,则将其转换为.jpg 如果图像大于500kB,则会减小其大小 我有一个全局$msgQueue=array;每当页面的所有逻辑完成时,在我的模板中,我会向用户回显函数在执行过程中可以添加的所有报告

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

该图像为PNG格式,已转换为JPG格式 图像是2000x1000,现在是1000x500 但是这种行为我认为是不规范的。如果我想与某人共享,在本例中,我的函数之一是checkImage$path,它无法工作,因为函数需要该全局数组来放置它们的报告msg


有没有标准的方法来解决这个问题,这样我就可以与其他人共享我的函数,而不用担心这种依赖性

我的建议是使用一个类,比如:

class Report(){
    public $msgQueue;

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

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

您可以使用同一类生成不同类型的报告,将过程与错误分开,例如,$processs=new Report和$errors=new Report

无需将变量声明为全局变量,该类保留其属性$msgQueue的值。您只需将$processs->addreportresizeing image添加到XXX即可

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


我真的不认为有一个标准的方法。我所做的是:

给出每个库的图像、文件等。。它自己的消息数组

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

执行Message::render时,它会将每个源的消息与消息类自己的消息相结合,然后呈现它们。 这样做允许每个库独立于其他库,同时仍然能够同时拥有每个实例和全局消息数组

有没有标准的解决方法 这个

是的,它的名字是:见的答案

但如果OOP不是一个选项,但是您应该认真考虑它,那么重构函数以接受MasaGeQueE参数并通过引用传递它可能起作用。

// 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'
)

这几乎就是我现在所做的,但是是的,也许构建一个对象作为消息就是解决方案