2016-12-20 3 views
1

[EDIT: Entschuldigung für die frühere schlecht formulierte Frage. . Insgesamt Rewrite]Wiederverwenden einer PHP-Variable aus einer Funktion über Dateien

Ich habe eine Wordpress-Website und ich bin auf der Suche nach 3 relevanten Dateien:

  • functions.php
  • header.php
  • index.php (einschließlich header.php)

ich ziehe Wetterdaten von einem externen Feed mit einer Funktion in der functions.php und dann versuchen, diese Daten an zwei Stellen angezeigt werden - einmal in header.php (auf jeder Seite der Website) und einmal in index.php (eine zweite Inst nur auf der Startseite angezeigt). Ich kann die erste Instanz angezeigt werden, aber ich habe Probleme mit der zweiten Instanz

In functions.php:

function arctic_valley_weather() { 
    function get_string_between($string, $start, $end){ 
     //here's a function that just parses the data. not important 
    } 

    $fullstring = file_get_contents('http://www.cnfaic.org/library/grabbers/nws_feed.php'); 
    $parsed = get_string_between($fullstring, 'arctic_valley,', 'marmot,'); 
    $weatherValues = explode(",",$parsed); 
    $dateTime = date_create($weatherValues[0]); 

    return array(
     'dateTime' => $dateTime, 
     'airTemp' => $weatherValues[1], 
     'relHumid' => $weatherValues[2], 
     'windSpeed' => $weatherValues[3], 
     'windDirection' => $weatherValues[4], 
     'windGust' => $weatherValues[5], 
    ); 
} 

Okay, dann in header.php:

$weatherData = arctic_valley_weather(); 
echo round($weatherData['airTemp']); 

Dies zeigt genau die Temperatur (gerundet). Sagen wir "18". Genial.

Ärger kommt in index.php, wenn ich will nur, dass genau das gleiche Ergebnis duplizieren:

echo round($weatherData['airTemp']); 

Dieses falsch „0“ zeigt, obwohl die anfängliche Instanz korrekt angezeigt wird 18.

Ich denke, das sind alle relevanten Daten. Irgendwas herausspringen?

+0

Versuchen Sie, eine [MVCE] (https://stackoverflow.com/help/mcve) oder einen Codeabschnitt zu erstellen, der genau das Problem darstellt, das Sie haben Ving. Versuchen Sie, Ihren Code so weit wie möglich zu reduzieren, und posten Sie ihn erneut zusammen mit Ihrer Site-Struktur (welche Datei enthält was). So wie es steht, kann niemand sagen, was falsch ist. Könnte viele Dinge sein. –

+0

Eine Sache, die ich sagen kann ist, dass Ihre Funktion überhaupt nicht funktionieren sollte, es sei denn Teile davon wurden entfernt. '$ weatherValues' ist nirgendwo definiert und die Funktion könnte es nicht verwenden, wenn es außerhalb der Funktion definiert wäre. Sie müssten das Schlüsselwort 'global' verwenden, um es zu verwenden. Und wenn sie global sind, ist es möglich, dass etwas modifiziert wird, bevor es zum zweiten Funktionsaufruf kommt. –

+0

Danke - Sie haben Recht. Das war nicht sehr gut. Ich habe die Frage umgeschrieben, um klarer zu sein. (Es war mehr an der Funktion, etc). Ich bin mir nicht sicher, ob ich noch etwas verlasse, aber das glaube ich nicht. – Lime

Antwort

1

Es sieht aus wie Wordpress enthält header.php in einem Funktionskörper. Dies bedeutet, dass alle Variablen, die in header.php definiert wurden, nicht mehr gültig sind, sobald Sie header.php verlassen haben. Sie können nicht auf die Variable in index.php, footer.php, page.php usw. zugreifen. Eine Lösung ist, Ihre Funktion erneut aufzurufen. Aber dies würde eine weitere Anfrage an Ihre externe Ressource machen, und das wäre wahrscheinlich eine Verschwendung. Oder Sie könnten es dem superglobalen $GLOBALS Array zuweisen.

Sehen Sie diesen ähnlichen Beitrag: setting variable in header.php but not seen in footer.php

So würden Sie so etwas in Ihrer header.php Datei zu tun haben:

$GLOBALS['weatherData'] = arctic_valley_weather(); 
echo $GLOBALS['weatherData']; 

Und in Ihrer index.php Datei, die Sie dies tun würden:

echo $GLOBALS['weatherData']; 
0

Zu allererst Sie globale Variablen verwenden ... dies ist nicht die Standard Verwendung von Variablen (oder sollten Sie genau wissen, was Sie tun!)

$variable = 'level 0'; 

function test_1() { 
    $variable = 'level 1'; 
    echo $variable; 
} 

echo $variable; // will work, because $variable is set to 'level 0'. 

test_1(); // will work, because $variable is set to 'level 1' ON THE FUNCTION 

function test_2() { 
    echo $variable; 
} 

echo test_2(); // Does not work, because $variable is not set INTERNALLY ON the function 

Natürlich ist es möglich, zu verwenden globale Variablen ... aber ist, dass Sie es tun wollen, Refactoring Ihre Logik und Code dieser Methode ausschließen :)

1

wie dies einige dieser Versuchen,
zunächst eine globale Variable in Ihrer function.php Datei deklarieren und dann zuweisen Werte dazu von Ihrer Methode wie thi s.

global $weatherData; 

function arctic_valley_weather() { 
    global $weatherData; 

    function get_string_between($string, $start, $end) { 
     //here's a function that just parses the data. not important 
    } 

    $fullstring = file_get_contents('http://www.cnfaic.org/library/grabbers/nws_feed.php'); 
    $parsed = get_string_between($fullstring, 'arctic_valley,', 'marmot,'); 
    $weatherValues = explode(",", $parsed); 
    $dateTime = date_create($weatherValues[0]); 

    $weatherData = array(
     'dateTime' => $dateTime, 
     'airTemp' => $weatherValues[1], 
     'relHumid' => $weatherValues[2], 
     'windSpeed' => $weatherValues[3], 
     'windDirection' => $weatherValues[4], 
     'windGust' => $weatherValues[5], 
    ); 
} 

in header.php oder index.php versuchen $weatherData wie dieser Zugriff:

global $weatherData; 
echo round($weatherData['airTemp']); 

hoffe, das hilft!

Verwandte Themen