2016-05-31 6 views
-1

Ich habe eine Funktion, die eine URL durch eine Curl-Anfrage lädt, aber ich habe gelesen, dass die Verwendung von global ist nicht die richtige/richtige Weise zu erreichen, was ich erreichen möchte.Variablen in einer Funktion mit globalem Gültigkeitsbereich erstellen?

Der folgende Code funktioniert für das, was ich versuche zu erreichen, jedoch nur mit dem globalen Schlüsselwort. Ist dies der beste Weg, dies zu erreichen? Vielen Dank.

<?php 

function loadURL($feedURL, $feedName) { 
global $$feedName; 

$curl = curl_init(); 
curl_setopt_array($curl, Array(
CURLOPT_URL   => $feedURL, 
CURLOPT_TIMEOUT  => 120, 
CURLOPT_CONNECTTIMEOUT => 30, 
CURLOPT_RETURNTRANSFER => TRUE, 
CURLOPT_ENCODING  => 'UTF-8', 
CURLOPT_INTERFACE  => 'IP.ADD.RE.SS' 
)); 
$data = curl_exec($curl); 
curl_close($curl); 
$$feedName = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA); 

} 

loadURL ("http://www.tesco.com/sitemap.xml", "TescoFeed"); 

var_dump($TescoFeed); 

?> 
+0

Sie nur '$ verwenden können GLOBALS [$$ feedName] = simplexml_load_string ($ data, 'SimpleXMLElement', LIBXML_NOCDATA); 'Aber warum nicht einfach 'zurückkommen'? – AbraCadaver

+0

Ich habe 'Rückkehr' versucht, aber es erlaubt mir nicht, auf die definierte Variable auf einer globalen Skala zuzugreifen? – huberu

+0

Warum nicht einfach ein assoziatives Array erstellen und zurückgeben? – Barmar

Antwort

1

Die Verwendung von Globals wird heutzutage oft abgeraten, und die Verwendung variabler Variablen ist in einer ähnlichen Linie. Sie sind ein handliches Werkzeug zu haben, aber in Fällen wie diesem würden Sie besser sein, ein Objekt zurückzugeben, mit dieser Eigenschaft anstelle einer Variablen Variable, zum Beispiel:

function loadURL($feedURL, $feedName) 
{ 
    // do stuff 
    $result = new stdClass(); 
    $result->{$feedName} = 'your results'; 

    return $result; 
} 

$result = loadURL('foo.bar', 'TescoFeed'); 
var_dump($result->TescoFeed); // your results 

Ich gehe davon aus, dass Sie mit unterschiedlichen Variablen für das Ergebnis dieser Methode, so dass Sie möglicherweise mehrere Feeds in einem Prozess ausführen können, aber vielleicht müssen Sie nicht einmal die Rendite unterscheiden?

+0

Das funktioniert gut für das, was ich tun möchte. Vielen Dank! – huberu

0

Geben Sie einfach die Daten zurück und weisen Sie sie einer Variablen im Aufrufer zu.

function loadURL($feedURL) { 
    global $$feedName; 

    $curl = curl_init(); 
    curl_setopt_array($curl, Array(
    CURLOPT_URL   => $feedURL, 
    CURLOPT_TIMEOUT  => 120, 
    CURLOPT_CONNECTTIMEOUT => 30, 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_ENCODING  => 'UTF-8', 
    CURLOPT_INTERFACE  => 'IP.ADD.RE.SS' 
    )); 
    $data = curl_exec($curl); 
    curl_close($curl); 
    return simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA); 
} 

$TescoFeed = loadURL ("http://www.tesco.com/sitemap.xml"); 

var_dump($TescoFeed); 

Dies ist allgemeiner, weil Sie das Ergebnis in einer Variablen, dem Array setzen können, oder ein Objekt oder var_dump() auf ihn nennen, usw.

Verwandte Themen