Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何执行函数”;“是”;当函数;x";是用PHP执行的_Php - Fatal编程技术网

“如何执行函数”;“是”;当函数;x";是用PHP执行的

“如何执行函数”;“是”;当函数;x";是用PHP执行的,php,Php,我有三个PHP文件,它们在不同的地方包含邮件函数。这是一个初步的实施。现在,我需要在应用程序日志中显示邮件发送计数和其他结果。我创建了几行语句,如下所示。我使用一个简单的increment++操作符来增加从数据库检索到的值: // Talking to database $previous_val = $from_db; // Getting previous value stores if(!empty($previous_val)|| $previous_val == 0 ){ $p

我有三个PHP文件,它们在不同的地方包含邮件函数。这是一个初步的实施。现在,我需要在应用程序日志中显示邮件发送计数和其他结果。我创建了几行语句,如下所示。我使用一个简单的increment++操作符来增加从数据库检索到的值:

// Talking to database
$previous_val = $from_db; // Getting previous value stores
if(!empty($previous_val)|| $previous_val == 0 ){
    $previous_val++;
    // Storing previous value here
}
else{
    $previous_val = 1;
    // Storing previous value here
}
问题是,当mail函数按如下方式运行时,我已经出于其他目的使用了一些其他语句:

if(mail($to, $subject, $msg, $headers)){
    // Other statements for other purposes are here
}
我不想在这三个文件中包含反陈述。因此,我想创建一个通用计数器函数,并在邮件块中与其他语句一起调用它,如下所示:

function mail_counter(){
    // Talking to database
    $previous_val = from_db; // Getting previous value stores
    if(!empty($previous_val)|| $previous_val == 0 ){
        $previous_val++;
        // Storing previous value here
    }
    else{
        $previous_val = 1;
        //Storing previous value here
    }
}
我想在所有邮件功能中使用上述功能,如下所示:

if(mail($to, $subject, $msg, $headers)){
    // Other statements for other purpose are here
    mail_counter();
}

一切正常。但是,我想进一步减少编码。这可能吗?我是否可以进一步将
mail\u counter()
函数与
mail
函数绑定,以便在调用
mail
函数时,也可以调用
mail\u counter()
函数?比如jQuery中的绑定。我不知道这是否可能

我也想为我的自定义函数做同样的事情。就像调用函数
x
一样,我也需要执行函数
y
。有很多重复的代码。我的主要目标是创建好的代码,不重复代码,并且有合理的行数。有人能帮我解决这个问题吗?

据我所知(几年前我问过这个问题),没有办法将观察器绑定到函数调用。唯一的方法(也是非常优雅的方法)就是编写您自己的函数或方法,并将相同的变量传递给
mail()
,然后让该函数或方法调用
mail()
。一般来说,邮件是一种“原子”功能,大多数现代平台在编码时不直接调用它,而是有某种邮件类,以便在发送前进行预配置,处理日志记录等


也许您可以调用函数
enhanced_mail()
,并使用它处理发送附件、密件抄送等。。有这样的类,但我想在这里更直接地回答您的问题。

我没有仔细考虑过这一点,但也许您可以使用类似于带有回调选项的
级联

在这种情况下,您将:

$mailer = new Cascade();
$mailer->addCallback(function() { ... });

$mailer->mail(arguments);
您还可以将最常见的函数放置在Cascade(或Cascade的子类)中,并使用静态方法:

Cascade::build('callback1')->mail(...arguments...)
或者在特定子类的生成调用中添加默认回调:

LoggingCascade::build()->mail(...arguments...)
由于magic _调用方法,只要定义了级联,它就可以调用任何东西


使用相同的逻辑,您可以扩展类以添加例如requisites(在实际函数调用之前调用的可调用函数,在某些情况下甚至可能中止调用-您使requisite返回true或false并相应地执行操作)或filter(获取
$ret
并对其进行操作的对象).

如果您想学习“好的编码”,您应该看看至少有10种默认方法可以通过使用设计模式来改进示例。@sharpner感谢您的链接。我试了几本对我没什么帮助的书。所以,如果我根据上面的问题得到解决方案,我认为这将有助于理解。所以我发布了这个问题。事实上,我只在oops设计中实现了上述功能。也许本教程将帮助您继续:您所做的不是面向对象的开发,因为您没有使用类、接口或interheritance=)没有我有类。我在两个文件中有两个类,在另一个单独的文件中有一个带有上述mail_counter()函数的helper类。我已经在邮件文件中包含了这两个类。我只是展示了没有类的代码示例。
mail
函数没有提供任何可以绑定的挂钩。做到这一点的“好”方法是创建自己的“邮件”函数,用于代码中。然后,除了调用邮件,您还可以更改该函数以执行任何需要的操作。(顺便说一句:OOP比在文件中包含类要复杂得多;)
LoggingCascade::build()->mail(...arguments...)