在PHP中,将变量声明为全局内部函数或将变量作为参数传递给函数有什么区别?

时间:2016-07-26 02:44:26

标签: php function global-variables global

将函数中的变量声明为globalpublic/private VS将其作为参数传递给函数有什么区别?

其他相关的混淆

我最近引起了一个很大的麻烦,试图将一个数组变量传递给一个函数global并在其中进行编辑并希望将其返回更改,并且花了我几个小时来弄清楚我需要通过引用将其作为参数传递给函数,如functionCall(&$arrayVar);

次要问题但我仍在疑惑,为什么不能将变量作为global传递,然后编辑它并用return将其吐出来或者只是通过连接变量数组来做什么?

我最近遇到的另一个例子是为PHPMailer创建一个函数,我在其中传递了几个参数,比如电子邮件地址和消息体,但我还需要传递它的身份验证字符串,比如API密钥等。在这里,每次我称之为:

  1. 我不想每次调用PHMailer函数时都要通过身份验证凭据(例如,在几个阶段之一发送电子邮件错误消息)
  2. 但我确实想在每次调用它时传递它唯一的参数
  3. 所以我认为最好的方法是这样的:

    function phpMailer( $mail_to = "to@email.com", $mail_from = "a@b.com" ) {
        global $authCredentials;
    }
    
    // And of course, when I call phpMailer, I call it like
    phpMailer("that.guy@there.com", "me@here.com");
    

    第三个问题:这是global的恰当用法还是我应该采取其他方式?

1 个答案:

答案 0 :(得分:2)

这里有很多问题,我会尝试介绍它们......

  

将函数中的变量声明为全局或公共/私有VS将其作为参数传递给函数有什么区别?

global是一种variable scope。将变量声明为global通常被认为是不好的做法,您应该尽量避免使用它。通过将变量作为参数传递给函数,代码更具可重用性,因为您知道函数所期望的内容并且它不依赖于某个未知的神秘全局变量。

publicprivateprotectedvisibility中使用的object oriented programming类型。这些基本上决定了其他类如何访问类中的属性和方法。

  

花了我几个小时才弄清楚我需要通过引用

将它作为参数传递给函数

要理解的功能是,除非你pass arguments by reference使用变量的副本,而不是原始副本。

  

为什么不能将变量作为global传递然后编辑它并用return将其吐出来或者只是通过连接到变量数组?

您不需要return global变量,因为您正在使用原始值。请再次参阅上面关于范围的链接。

  

我最近遇到的另一个例子是为PHPMailer创建一个函数,我在其中传递了几个参数,比如电子邮件地址和消息体,但我还需要传递它的身份验证字符串,比如API密钥等。

除了使用global之外,还有几种方法可以解决这个问题。如果您计划在多个位置使用此身份验证密钥,最简单的解决方案可能是定义constant,例如:

define('AUTH', 'my_key');
function phpMailer( $mail_to = "to@email.com", $mail_from = "a@b.com" ) {
    echo AUTH;
}

但同样,该函数现在不再可重用,因为它依赖于该常量。一个更好的解决方案可能是将它包装在一个对象中:

class phpMailer()
{
    private $auth = 'my_key';

    public function send($mail_to, $mail_from)
    {
        $this->auth;
    }
}
$mail = new phpMailer();
$mail->send('to@email.com', 'a@b.com');

希望这会有所帮助。上面链接中的在线PHP文档包含大量信息。