2010-03-27 10 views
52

tengo una matriz exterior:Dar mi acceso a las funciones de variable fuera

$myArr = array(); 

me gustaría dar mi acceso a las funciones de la matriz fuera de ella por lo que puede añadir valores a que

function someFuntion(){ 
    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal; 
} 

¿Cómo le doy a la función el alcance correcto para la variable?

Respuesta

93

De forma predeterminada, cuando se está dentro de una función, no tiene acceso a las variables externas.


Si usted quiere que su función para tener acceso a una variable externa, tiene que declarar como global, dentro de la función:

function someFuntion(){ 
    global $myArr; 
    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal; 
} 

Para más información, ver Variable scope.

Pero tenga en cuenta que utilizando variables globales no es una buena práctica: con esto, su función ya no es independiente.


Una mejor idea sería la de hacer su función devolver el resultado:

function someFuntion(){ 
    $myArr = array();  // At first, you have an empty array 
    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal;  // Put that $myVal into the array 
    return $myArr; 
} 

y llamar a la función como esta:

$result = someFunction(); 


Su función también podría tomar parámetros , e incluso trabajan en un parámetro pasado por referencia:

function someFuntion(array & $myArr){ 
    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal;  // Put that $myVal into the array 
} 

A continuación, llamar a la función como esta:

$myArr = array(...); 
someFunction($myArr); // The function will receive $myArr, and modify it 

Con esta:

  • Su función que se recibe la matriz externa como un parámetro
  • Y puede modificarlo, ya que es pasado por referencia.
  • Y es una mejor práctica que usar una variable global: su función es una unidad, independiente de cualquier código externo.


Para más información sobre esto, debe leer la sección Functions del manual de PHP, y ,, en particular, las siguientes subsecciones:

+1

¿Qué pasa con todos los votos a la baja? – PatrikAkerstrand

+2

@Machine: una buena pregunta ^^ * (Desde entonces, he editado mi respuesta un par de veces para agregar más información, tal vez fue downvoted porque no está lo suficientemente completo, al principio ... Probablemente tiene algo que ver con global, que a la gente no le gusta ...) * –

+3

@Machine Mr Anti-Global @Coronatus ha decidido que las respuestas perfectamente viables son incorrectas. Y su representante de 1.662 lo hace bien ... –

8
$myArr = array(); 

function someFuntion(array $myArr) { 
    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal; 

    return $myArr; 
} 

$myArr = someFunction($myArr); 
+6

downvoting estúpida. Por supuesto, esta es la única respuesta correcta en todo el hilo. – user187291

2

La única y probablemente no tan buena manera de lograr su objetivo sería el uso de variables globales.

Puede lograr eso agregando global $myArr; al comienzo de su función. Sin embargo, tenga en cuenta que el uso de variables globales es en la mayoría de los casos una mala idea y probablemente evitable.

La forma mucho mejor sería la superación de su matriz como un argumento a su función:

function someFuntion($arr){ 
    $myVal = //some processing here to determine value of $myVal 
    $arr[] = $myVal; 
    return $arr; 
} 

$myArr = someFunction($myArr); 
7
Global $myArr; 
$myArr = array(); 

function someFuntion(){ 
    global $myArr; 

    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal; 
} 

estar prevenido, en general, las personas se adhieren lejos de variables globales, ya que tiene algunas desventajas.

Usted podría intentar esto

function someFuntion($myArr){ 
    $myVal = //some processing here to determine value of $myVal 
    $myArr[] = $myVal; 
    return $myArr; 
} 
$myArr = someFunction($myArr); 

que haría lo que no está confiando en Globals.

+0

Lo global dentro del alcance de la función sería suficiente, ¿se agregó uno al alcance "principal" intencionalmente? ¿Buena práctica? (nunca se usa globals ..) – svens

+0

El "global" fuera de la función es inútil, a menos que el archivo completo se haya incluido desde otra función. – andreszs

7
$foo = 42; 
$bar = function($x = 0) use ($foo){ 
    return $x + $foo; 
}; 
var_dump($bar(10)); // int(52) 
+0

Tan elegante ... ¡Buena respuesta! –

0

dos respuestas

1. respuesta a la pregunta formulada.

2. Un simple cambio es igual a una mejor manera!

Respuesta 1 - pasar la matriz Vars a la __construct() en una clase, también se podría dejar el constructo vacío y pasar las matrices a través de sus funciones en su lugar.

<?php 

// Create an Array with all needed Sub Arrays Example: 
// Example Sub Array 1 
$content_arrays["modals"]= array(); 
// Example Sub Array 2 
$content_arrays["js_custom"] = array(); 

// Create a Class 
class Array_Pushing_Example_1 { 

    // Public to access outside of class 
    public $content_arrays; 

    // Needed in the class only 
    private $push_value_1; 
    private $push_value_2; 
    private $push_value_3; 
    private $push_value_4; 
    private $values; 
    private $external_values; 

    // Primary Contents Array as Parameter in __construct 
    public function __construct($content_arrays){ 

     // Declare it 
     $this->content_arrays = $content_arrays; 

    } 

    // Push Values from in the Array using Public Function 
    public function array_push_1(){ 

     // Values 
     $this->push_values_1 = array(1,"2B or not 2B",3,"42",5); 
     $this->push_values_2 = array("a","b","c"); 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_1 as $this->values){ 

      $this->content_arrays["js_custom"][] = $this->values; 

     } 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_2 as $this->values){ 

      $this->content_arrays["modals"][] = $this->values; 

     } 

    // Return Primary Array with New Values 
    return $this->content_arrays; 

    } 

    // GET Push Values External to the Class with Public Function 
    public function array_push_2($external_values){ 

     $this->push_values_3 = $external_values["values_1"]; 
     $this->push_values_4 = $external_values["values_2"]; 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_3 as $this->values){ 

      $this->content_arrays["js_custom"][] = $this->values; 

     } 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_4 as $this->values){ 

      $this->content_arrays["modals"][] = $this->values; 

     } 

    // Return Primary Array with New Values 
    return $this->content_arrays; 

    } 

} 

// Start the Class with the Contents Array as a Parameter 
$content_arrays = new Array_Pushing_Example_1($content_arrays); 

// Push Internal Values to the Arrays 
$content_arrays->content_arrays = $content_arrays->array_push_1(); 

// Push External Values to the Arrays 
$external_values = array(); 
$external_values["values_1"] = array("car","house","bike","glass"); 
$external_values["values_2"] = array("FOO","foo"); 
$content_arrays->content_arrays = $content_arrays->array_push_2($external_values); 

// The Output 
echo "Array Custom Content Results 1"; 
echo "<br>"; 
echo "<br>"; 

echo "Modals - Count: ".count($content_arrays->content_arrays["modals"]); 
echo "<br>"; 
echo "-------------------"; 
echo "<br>"; 

// Get Modals Array Results 
foreach($content_arrays->content_arrays["modals"] as $modals){ 

    echo $modals; 
    echo "<br>"; 

} 

echo "<br>"; 
echo "JS Custom - Count: ".count($content_arrays->content_arrays["js_custom"]); 
echo "<br>"; 
echo "-------------------"; 
echo "<br>"; 

// Get JS Custom Array Results 
foreach($content_arrays->content_arrays["js_custom"] as $js_custom){ 

    echo $js_custom; 
    echo "<br>"; 


} 

echo "<br>"; 

?> 

Respuesta 2 - Un simple cambio obstante lo pondría en línea con los estándares modernos. Simplemente declare sus matrices en la clase.

<?php 

// Create a Class 
class Array_Pushing_Example_2 { 

    // Public to access outside of class 
    public $content_arrays; 

    // Needed in the class only 
    private $push_value_1; 
    private $push_value_2; 
    private $push_value_3; 
    private $push_value_4; 
    private $values; 
    private $external_values; 

    // Declare Contents Array and Sub Arrays in __construct 
    public function __construct(){ 

     // Declare them 
     $this->content_arrays["modals"] = array(); 
     $this->content_arrays["js_custom"] = array(); 

    } 

    // Push Values from in the Array using Public Function 
    public function array_push_1(){ 

     // Values 
     $this->push_values_1 = array(1,"2B or not 2B",3,"42",5); 
     $this->push_values_2 = array("a","b","c"); 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_1 as $this->values){ 

      $this->content_arrays["js_custom"][] = $this->values; 

     } 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_2 as $this->values){ 

      $this->content_arrays["modals"][] = $this->values; 

     } 

    // Return Primary Array with New Values 
    return $this->content_arrays; 

    } 

    // GET Push Values External to the Class with Public Function 
    public function array_push_2($external_values){ 

     $this->push_values_3 = $external_values["values_1"]; 
     $this->push_values_4 = $external_values["values_2"]; 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_3 as $this->values){ 

      $this->content_arrays["js_custom"][] = $this->values; 

     } 

     // Loop Values and Push Values to Sub Array 
     foreach($this->push_values_4 as $this->values){ 

      $this->content_arrays["modals"][] = $this->values; 

     } 

    // Return Primary Array with New Values 
    return $this->content_arrays; 

    } 

} 

// Start the Class without the Contents Array as a Parameter 
$content_arrays = new Array_Pushing_Example_2(); 

// Push Internal Values to the Arrays 
$content_arrays->content_arrays = $content_arrays->array_push_1(); 

// Push External Values to the Arrays 
$external_values = array(); 
$external_values["values_1"] = array("car","house","bike","glass"); 
$external_values["values_2"] = array("FOO","foo"); 
$content_arrays->content_arrays = $content_arrays->array_push_2($external_values); 

// The Output 
echo "Array Custom Content Results 1"; 
echo "<br>"; 
echo "<br>"; 

echo "Modals - Count: ".count($content_arrays->content_arrays["modals"]); 
echo "<br>"; 
echo "-------------------"; 
echo "<br>"; 

// Get Modals Array Results 
foreach($content_arrays->content_arrays["modals"] as $modals){ 

    echo $modals; 
    echo "<br>"; 

} 

echo "<br>"; 
echo "JS Custom - Count: ".count($content_arrays->content_arrays["js_custom"]); 
echo "<br>"; 
echo "-------------------"; 
echo "<br>"; 

// Get JS Custom Array Results 
foreach($content_arrays->content_arrays["js_custom"] as $js_custom){ 

    echo $js_custom; 
    echo "<br>"; 


} 

echo "<br>"; 

?> 

Ambas opciones de salida de la misma información y permitir una función de empujar y recuperar información de una matriz y sub matrices a cualquier lugar en el código (Teniendo en cuenta que los datos han sido empujado primero). La segunda opción brinda más control sobre cómo se usan y protegen los datos. Se pueden usar simplemente modificando sus necesidades, pero si se usaron para extender un Controlador, podrían compartir sus valores entre cualquiera de las Clases que el Controlador está utilizando.Ninguno de los métodos requiere el uso de un Global (s).

de salida:

matriz de contenido personalizado Resultados

Modals - Count: 5

un

b

c

FOO

foo

JS Custom - Count: 9

2B o no 2B

coche

casa

moto

vidrio

Cuestiones relacionadas