En PHP, ¿cuál es la diferencia entre declarar una variable como función interna global, o pasar la variable como un argumento a la función?

¿Cuál es la diferencia entre declarar una variable dentro de una función como VS global o public/private pasándola a una función como argumento?

Otra confusión relacionada

Recientemente me causé un gran dolor de cabeza al tratar de pasar una variable de matriz a una función tan global y editarla por dentro con la esperanza de devolverla alterada, y me tomó horas darme cuenta de que necesitaba pasarla a la función como una argumento por referencia, como functionCall(&$arrayVar);

Pregunta secundaria: Pero aún me pregunto, ¿por qué no funciona pasar la variable en forma global luego editarla y escupirla con return o simplemente haciendo algo como concatenar a la matriz variable?

Otro ejemplo con el que me encontré recientemente es haciendo una función para PHPMailer, donde le paso varios argumentos, como dirección de correo electrónico y cuerpo del mensaje, pero también necesito pasar cadenas de autenticación, como la clave de API, etc. Aquí, cada uno tiempo que lo llamo:

  1. No quiero tener que pasar las credenciales de autenticación cada vez que llamo a la función PHMailer (por ejemplo, al mensaje de error de correo electrónico en una de varias etapas)
  2. Pero sí quiero pasarle argumentos únicos cada vez que lo llamo

Así que pensé que la mejor manera es así:

 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"); 

Pregunta terciaria: ¿Es este uso apropiado de global o hay alguna otra manera en que debería estar haciendo esto?

Solutions Collecting From Web of "En PHP, ¿cuál es la diferencia entre declarar una variable como función interna global, o pasar la variable como un argumento a la función?"

Hay muchas preguntas aquí, intentaré recorrerlas …

¿Cuál es la diferencia entre declarar una variable dentro de una función como VS global o pública / privada pasándola a una función como argumento?

global es un tipo de scope variable . Declarar una variable como global generalmente se considera una mala práctica y debes intentar evitarla. Al pasar la variable a una función como argumento, el código es más reutilizable porque usted sabe lo que espera la función y no depende de una variable global misteriosa desconocida.

public , private , protected son los tipos de visibilidad utilizados en la progtwigción orientada a objetos . Básicamente, esto determina cómo otras clases pueden acceder a las propiedades y métodos dentro de una clase.

me tomó horas darme cuenta de que necesitaba pasarlo a la función como un argumento por referencia

Algo para comprender acerca de las funciones es que, a menos que pase argumentos por referencia , está trabajando con una copia de la variable, no del original.

¿Por qué no funciona pasar la variable en forma global , editarla y escupirla con return o simplemente haciendo algo como concatenar a la matriz variable?

No necesitaría return una variable global , porque está trabajando con el valor original. Por favor refiérase nuevamente al enlace arriba sobre el scope.

Otro ejemplo con el que me encontré recientemente es haciendo una función para PHPMailer, donde le paso varios argumentos, como la dirección de correo electrónico y el cuerpo del mensaje, pero también necesito pasar cadenas de autenticación, como la clave de API, etc.

Hay varias formas de abordar esto además de usar global . Si planea usar esta clave de autenticación en más de un lugar, la solución más fácil sería definir una constante , por ejemplo:

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

Pero, de nuevo, la función ahora es menos reutilizable porque depende de esa constante. Una mejor solución sería probablemente envolverlo en un objeto:

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

Espero que esto ayude. La documentación en línea de PHP que se encuentra en los enlaces anteriores contiene una gran cantidad de información.