Ich gebe meiner Funktion Zugriff auf eine externe Variable


76

Ich habe ein Array außerhalb:

$myArr = array();

Ich möchte meiner Funktion Zugriff auf das Array außerhalb des Arrays gewähren, damit es Werte hinzufügen kann

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

Wie gebe ich der Funktion den richtigen Bereich für die Variable?

Antworten:


127

Wenn Sie sich in einer Funktion befinden, haben Sie standardmäßig keinen Zugriff auf die äußeren Variablen.


Wenn Ihre Funktion Zugriff auf eine äußere Variable haben soll, müssen Sie diese globalinnerhalb der Funktion wie folgt deklarieren :

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

Weitere Informationen finden Sie unter Variabler Bereich .

Beachten Sie jedoch, dass die Verwendung globaler Variablen keine gute Vorgehensweise ist : Damit ist Ihre Funktion nicht mehr unabhängig.


Eine bessere Idee wäre, Ihre Funktion das Ergebnis zurückgeben zu lassen :

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

Und rufen Sie die Funktion folgendermaßen auf:

$result = someFunction();


Ihre Funktion kann auch Parameter annehmen und sogar an einem Parameter arbeiten, der als Referenz übergeben wird :

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

Rufen Sie dann die Funktion folgendermaßen auf:

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

Mit diesem :

  • Ihre Funktion hat das externe Array als Parameter erhalten
  • Und kann es ändern, wenn es als Referenz übergeben wird.
  • Und es ist besser als die Verwendung einer globalen Variablen: Ihre Funktion ist eine Einheit, unabhängig von externem Code.


Weitere Informationen hierzu finden Sie im Abschnitt Funktionen des PHP-Handbuchs und insbesondere in den folgenden Unterabschnitten:


3
@Machine: eine ziemlich gute Frage ^^ (Ich habe meine Antwort seitdem ein paar Mal bearbeitet, um weitere Informationen hinzuzufügen; vielleicht wurde sie abgelehnt, weil sie zunächst nicht vollständig genug war ... Es hat wahrscheinlich etwas mit global zu tun, welche Leute nicht mögen ...)
Pascal MARTIN

3
@Machine Herr Anti-Global @Coronatus hat entschieden, dass absolut tragfähige Antworten falsch sind. Und seine 1.662 Wiederholungen machen ihn richtig ...
Tyler Carter

1
Ich habe Ihre ursprüngliche Version gelesen, sie war immer noch sehr gut genug für eine +1 Stimme und definitiv keine Abstimmungen wert.
PatrikAkerstrand

globalMethode verweist auf globale Variable, nicht außerhalb!
Eugene Mala

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

UPDATE: Es gibt jetzt Unterstützung für Pfeilfunktionen, aber ich werde jemanden zulassen, der es mehr verwendet hat, um die Antwort zu erstellen


11
Global $myArr;
$myArr = array();

function someFuntion(){
    global $myArr;

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

Seien Sie gewarnt, im Allgemeinen halten sich die Menschen von den Globalen fern, da dies einige Nachteile hat.

Sie könnten dies versuchen

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

Das würde es so machen, dass Sie sich nicht auf Globals verlassen.


Das globale innerhalb des Funktionsumfangs würde ausreichen. Haben Sie absichtlich einen zum Hauptbereich hinzugefügt? Gute Übung? (nie mit Globals ..)
Svens

Das "globale" außerhalb der Funktion ist nutzlos, es sei denn, die gesamte Datei wurde von einer anderen Funktion aufgenommen.
andreszs

9
$myArr = array();

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

    return $myArr;
}

$myArr = someFunction($myArr);

1
Die Qualität dieser Antwort würde sich erheblich verbessern, wenn es eine Erklärung für das Snippet gäbe.
Mickmackusa

3

Der einzige und wahrscheinlich nicht so gute Weg, um Ihr Ziel zu erreichen, wäre die Verwendung globaler Variablen.

Sie können dies erreichen, indem Sie global $myArr;am Anfang Ihrer Funktion hinzufügen . Beachten Sie jedoch, dass die Verwendung globaler Variablen in den meisten Fällen eine schlechte Idee ist und wahrscheinlich vermieden werden kann.

Der viel bessere Weg wäre, Ihr Array als Argument an Ihre Funktion zu übergeben:

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

$myArr = someFunction($myArr);

0

Zwei Antworten

1. Beantworten Sie die gestellte Frage.

2. Eine einfache Änderung ist ein besserer Weg!

Antwort 1 - Übergeben Sie das Vars-Array an __construct () in einer Klasse. Sie können das Konstrukt auch leer lassen und die Arrays stattdessen über Ihre Funktionen übergeben.

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

?>

Antwort 2 - Eine einfache Änderung würde sie jedoch an moderne Standards anpassen. Deklarieren Sie einfach Ihre Arrays in der Klasse.

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

?>

Beide Optionen geben dieselben Informationen aus und ermöglichen es einer Funktion, Informationen von einem Array und Sub-Arrays an eine beliebige Stelle im Code zu übertragen und abzurufen (vorausgesetzt, die Daten wurden zuerst übertragen). Die zweite Option bietet mehr Kontrolle darüber, wie die Daten verwendet und geschützt werden. Sie können so verwendet werden, wie sie nur Ihren Anforderungen entsprechen. Wenn sie jedoch zum Erweitern eines Controllers verwendet werden, können sie ihre Werte für eine der vom Controller verwendeten Klassen freigeben. Keine der beiden Methoden erfordert die Verwendung eines Global (s).

Ausgabe:

Array Benutzerdefinierte Inhaltsergebnisse

Modalitäten - Anzahl: 5

ein

b

c

FOO

foo

JS Custom - Anzahl: 9

1

2B oder nicht 2B

3

42

5

Auto

Haus

Fahrrad

Glas


Es gibt so viel unabhängigen Code, dass es schwierig ist, die Lösungen zu sehen, die Sie hier vorschlagen.
Robrecord
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.