web-dev-qa-db-fra.com

Donner à ma fonction l'accès à une variable extérieure

J'ai un tableau à l'extérieur: 

$myArr = array();

Je souhaite donner à ma fonction l'accès au tableau situé en dehors de celui-ci afin qu'il puisse y ajouter des valeurs

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

Comment est-ce que je donne à la fonction la portée adéquate à la variable?

59
brett

Par défaut, lorsque vous êtes dans une fonction, vous n'avez pas accès aux variables externes.


Si vous voulez que votre fonction ait accès à une variable externe, vous devez la déclarer en tant que global, à l'intérieur de la fonction:

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

Pour plus d'informations, voir Variable scope .

Mais notez que utiliser des variables globales n'est pas une bonne pratique: avec cela, votre fonction n'est plus indépendante.


Une meilleure idée serait de rendre votre fonction renvoyer le résultat:

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;
}

Et appelez la fonction comme ceci:

$result = someFunction();


Votre fonction pourrait aussi prendre des paramètres, et même travailler sur un paramètre passé par référence:

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

Ensuite, appelez la fonction comme ceci:

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

Avec ça :

  • Votre fonction a reçu le tableau externe en tant que paramètre
  • Et peut le modifier, comme il est passé par référence.
  • Et il vaut mieux utiliser une variable globale: votre fonction est une unité, indépendante de tout code externe.


Pour plus d’informations à ce sujet, vous devriez lire la section Fonctions du manuel PHP, et plus particulièrement les sous-sections suivantes:

109
Pascal MARTIN
$foo = 42;
$bar = function($x = 0) use ($foo){
    return $x + $foo;
};
var_dump($bar(10)); // int(52)
16
Maxwell s.c
$myArr = array();

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

    return $myArr;
}

$myArr = someFunction($myArr);
8
Amy B
Global $myArr;
$myArr = array();

function someFuntion(){
    global $myArr;

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

Soyez prévenu, généralement les gens s'éloignent des globals car il a quelques inconvénients.

Tu pourrais essayer ça

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

Cela ferait en sorte que vous ne comptiez pas sur Globals.

8
Tyler Carter

Le seul et probablement le moins bon moyen d'atteindre votre objectif serait d'utiliser des variables globales.

Vous pouvez y parvenir en ajoutant global $myArr; au début de votre fonction ..__ Cependant, notez que l'utilisation de variables globales est dans la plupart des cas une mauvaise idée et probablement évitable.

Le meilleur moyen serait de passer votre tableau en argument à votre fonction:

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

$myArr = someFunction($myArr);
2
lamas

Deux réponses

1. Réponse à la question posée.

2. Un simple changement équivaut à une meilleure solution!

Réponse 1 - Passez le tableau Vars à la classe __construct () dans une classe. Vous pouvez également laisser la construction vide et passer les tableaux à la place de vos fonctions.

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

?>

Réponse 2 - Un simple changement le mettrait cependant en conformité avec les normes modernes ... Déclarez simplement vos tableaux dans la classe.

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

?>

Les deux options génèrent les mêmes informations et permettent à une fonction d'envoyer et de récupérer des informations d'un tableau et de sous-tableaux à n'importe quel emplacement du code (étant donné que les données ont été transférées en premier). La deuxième option permet de mieux contrôler la manière dont les données sont utilisées et protégées. Ils peuvent être utilisés tels quels, selon vos besoins, mais s'ils étaient utilisés pour étendre un contrôleur, ils pourraient partager leurs valeurs entre toutes les classes utilisées par le contrôleur. Aucune de ces méthodes ne nécessite l'utilisation d'un ou plusieurs globaux.

Sortie:

Résultats du contenu personnalisé de la matrice

Modals - Compte: 5

une

b

c

FOO

foo

JS Custom - Nombre: 9

1

2B ou non 2B

3

42

5

voiture

maison

bicyclette

verre

0
Vector-Meister