将函数中的变量声明为global
或public/private
VS将其作为参数传递给函数有什么区别?
其他相关的混淆
我最近引起了一个很大的麻烦,试图将一个数组变量传递给一个函数global
并在其中进行编辑并希望将其返回更改,并且花了我几个小时来弄清楚我需要通过引用将其作为参数传递给函数,如functionCall(&$arrayVar);
次要问题但我仍在疑惑,为什么不能将变量作为global
传递,然后编辑它并用return
将其吐出来或者只是通过连接变量数组来做什么?
我最近遇到的另一个例子是为PHPMailer创建一个函数,我在其中传递了几个参数,比如电子邮件地址和消息体,但我还需要传递它的身份验证字符串,比如API密钥等。在这里,每次我称之为:
所以我认为最好的方法是这样的:
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
的恰当用法还是我应该采取其他方式?
答案 0 :(得分:2)
这里有很多问题,我会尝试介绍它们......
将函数中的变量声明为全局或公共/私有VS将其作为参数传递给函数有什么区别?
global
是一种variable scope。将变量声明为global
通常被认为是不好的做法,您应该尽量避免使用它。通过将变量作为参数传递给函数,代码更具可重用性,因为您知道函数所期望的内容并且它不依赖于某个未知的神秘全局变量。
public
,private
,protected
是visibility中使用的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文档包含大量信息。