Usando vars globales dentro de una función en PHP de la forma en que lo haces en Javascript

Tengo una función que usa muchos vars y arrays globales, por ejemplo,

$a=1; $b[0]='a'; $b[1]='b'; $c='Hello'; function foo() { echo "$a $b[0] $b[1] $c"; } 

Entiendo que, a diferencia de JS, tiene que incluir las vars cuando llama a la función:

 function foo($a,$b,$c) 

pero ya que estoy usando muchas vars y arrays diferentes en la función, y como el origen principal de la mayoría de las vars es la matriz $ _GET (después de usar extracto ($ _ GET)), no estoy seguro de cómo hacerlo .

¿Hay alguna manera de hacer que una función PHP se comporte como una función JS de esa manera?

Puede utilizar la palabra clave global:

 $a = "Hello World"; $b = "Hello World"; function outputStrings(){ global $a, $b; echo $a." - ".$b; } $b = "Goodbye World"; outputStrings(); // ouputs "Hello World - Goodbye World" 

Sin embargo, es mejor no usar esta estructura. Es generalmente confuso y hará que su código sea difícil de mantener. WordPress usa mucho este enfoque en su base de código y hace que la depuración sea muy complicada. Otros complementos y códigos pueden intercalar y modificar variables globales, cambiando la salida de su script.

Lo que sería mejor sería:

Use una estructura de POO para su aplicación web.

De esta manera puede usar objetos en lugar de solo variables globales aleatorias. Esto evita el problema de que usted sobrescriba accidentalmente una variable global en el curso de un script. También ayuda a organizar las variables correctamente, por lo que todas las variables relacionadas con los usuarios pueden estar en la clase User . Tiene más sentido estructurarlo así.

 class User { private $firstName; private $secondName; private $gender; public function __construct($fname, $sname, $gend){ $this->firstName = $fname; $this->secondName = $sname; $this->gender = $gend; } public function outputDetails(){ echo $this->firstName." ".$this->secondName." is ".$this->gender; } } $user = new User("Thomas", "Clayson", "Male"); $user->outputDetails(); 

Pasa variables a funciones

Al igual que has mostrado en tu ejemplo. Esta es la forma estándar generalmente aceptada de hacer esto. Siempre debes pasar variables como esta, te ayuda a definir los ámbitos y una estructura adecuada. También significa que usted sabe cuál es el valor de las variables, ya que las posee y las pasa a las funciones, en lugar de simplemente seleccionar las variables del scope global.

Debe usar la palabra clave “global”, que le dice al comstackdor que busque variables globales.

 function foo() { **global $a, $b, $c;** echo "$a $b[0] $b[1] $c"; } 

Ya que en PHP no tiene que declarar variables antes de usarlas, el siguiente código es ambiguo en cuanto a a qué variable se refiere la función.

 $a = 'ten'; function foo($a) { echo($a); } foo(10); // Outputs: 10 

PHP elimina la ambigüedad asumiendo que todas las variables en el scope de una función son locales, a menos que se declare que la función proviene del scope global mediante el uso de la palabra clave global .

 $a = 10; function foo($b) { global $a; echo($a); } foo('ten'); // Outputs: 10 

En general, se desaconseja el uso de variables globales, ya que introduce un acoplamiento estrecho entre los objetos, disminuye la legibilidad y la ubicación del código, contamina el espacio de nombres global y aumenta la carga mental de los desarrolladores que tienen que recordar cuántas variables globales tienen. .

Puede acceder a vars global con palabra clave global :

 global $a=1; global $b[0]='a'; global $b[1]='b'; global $c='Hello'; function foo() { global $a, $b, $c; echo "$a $b[0] $b[1] $c"; } 

De lo contrario, puede utilizar la matriz $GLOBALS predefinida:

 function foo() { echo "$GLOBALS['a'] $GLOBALS['b'][0] $GLOBALS['b'][1] $GLOBALS[c]"; } 

Aquí tienes más información:

http://php.net/manual/en/language.variables.scope.php

Cuando tiene una función, la administración de contexto en PHP 5.3 no permite el acceso a variables globales sin el uso de la palabra clave “global”.

Php.net tiene una publicación sobre el tema aquí .

 function foo() { global $a, $b, $c; echo "$a $b[0] $b[1] $c"; }