wake-up-neo.com

Kann nicht auf globale Variable innerhalb der Funktion zugreifen

Diese (vereinfachte Version meines Codes) funktioniert nicht:

<?php
    $sxml = new SimpleXMLElement('<somexml/>');

    function foo(){
        $child = $sxml->addChild('child');
    }

    foo();
?>

Warum? Ich möchte auf $sxml Zugreifen, weil ich Fehler darauf protokollieren möchte, wenn foo() fehlschlägt. foo() ruft sich selbst rekursiv auf, um eine Verzeichnisliste zu erstellen, daher befürchte ich, dass die Weitergabe des gesamten $sxml an sich selbst (wie in foo($sxml)) die Leistung beeinträchtigen könnte.

Gibt es eine Möglichkeit, innerhalb von $sxml Auf $foo Zuzugreifen, ohne es als Argument zu übergeben? (PHP 5.2.x +)

EDIT: Was ist, wenn der Code tatsächlich so aussieht?

<?php
    bar(){
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo(){
            $child = $sxml->addChild('child');
        }
        foo();
    }
    bar();
?>
56
Camilo Martin

Sie müssen es an die Funktion übergeben:

<?php
    $sxml = new SimpleXMLElement('<somexml/>');

    function foo($sxml){
        $child = $sxml->addChild('child');
    }

    foo($sxml);
?>

oder deklariere es global :

<?php
    $sxml = new SimpleXMLElement('<somexml/>');

    function foo(){
        global $sxml;
        $child = $sxml->addChild('child');
    }

    foo();
?>

Wenn die Variable nicht global ist, sondern in einer äußeren Funktion definiert ist, funktioniert die erste Option (die als Argument übergeben wird) genauso:

<?php
    function bar() {
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo($sxml) {
            $child = $sxml->addChild('child');
        }
        foo($sxml);
    }
    bar();
?>

Alternativ können Sie ein Closure erstellen, indem Sie die Variable in einer use -Klausel deklarieren.

<?php
    function bar() {
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo() use(&$xml) {
            $child = $sxml->addChild('child');
        }
        foo();
    }
    bar();
?>
110
Javi R

Sie müssen die globale Variable explizit in den Funktionsumfang einladen:

function foo(){
    global $sxml;
    $child = $sxml->addChild('child');
}
20
mario

Verwenden Sie das globale Schlüsselwort, um $ sxml in Ihrer Funktion zu deklarieren.

<?php
    $sxml = new SimpleXMLElement('<somexml/>');
    function foo(){
    global   $sxml;  
    $child = $sxml->addChild('child');
    }
    foo();
?>
4
Shamim Hafiz

eine andere Lösung besteht darin, $ GLOBALS zu verwenden, während Sie diese Variable deklarieren:

         $my_var   = 'blabla';    // not global
$GLOBALS['my_var'] = 'blabla';    // global  (correct)
4
T.Todua

Obwohl die Top-Antwort eine gute Lösung bietet, möchte ich behaupten, dass die geeignete Lösung in den meisten modernen PHP) -Anwendungen darin besteht, eine Klasse mit einer statischen Variablen wie folgt zu erstellen:

<?php

class xmlHelper {
    private static $sxml;

    public function getXML() {
        return self::$sxml;
    }

    public function setXML($xml) {
        self::$sxml = $xml;
    }
}

xmlHelper::setXML(new SimpleXMLElement('<somexml/>'));

function foo(){
    $child = xmlHelper::getXML()->addChild('child');
}

foo();

Dieser Ansatz ermöglicht es Ihnen, innerhalb von foo() auf $sxml Zuzugreifen, wie Sie es wollten, hat jedoch einige Vorteile gegenüber dem Ansatz global.

  1. Mit dieser Strategie können Sie immer einen Haltepunkt in setXML() einfügen, um herauszufinden, welcher Teil Ihrer Anwendung diesen Wert manipuliert hat. Dies ist bei der Manipulation von globalen Werten nicht möglich.
  2. Sie vermeiden, den globalen Namespace mit einem generischen Variablennamen sxml zu verschmutzen.
3
Matt Korostoff