2009-06-23 12 views
3

Betrachten Sie die folgende SituationOuter Variable Zugriff in PHP Klasse

Datei: ./include/functions/table-config.php enthält:

. 
. 
$tablePages = 'orweb_pages'; 
. 
. 

Datei: ./include/classes/uri-resolve. php enthält:

class URIResolve { 
. 
. 
$category = null ; 
. 
. 
function process_uri() { 
... 
    $this->category = $tablePages; 
... 
} 
. 
. 
}

Datei: ./settings.php enthält:

. 
. 
require_once(ABSPATH.INC.FUNC.'/table-config.php'); 
require_once(ABSPATH.INC.CLASS.'/uri-resolve.php'); 
. 
. 
wird diese Arbeit. Ich meine, wird der Zugriff auf $ tablePages von process_uri() akzeptabel sein oder wird es unrichtige Ergebnisse geben.

Bitte schlagen Sie Korrekturen oder Problemumgehungen vor, wenn Fehler auftreten können.

Antwort

3

Verwenden Sie eine globale (nicht empfohlen), eine Konstante oder ein Singleton Konfigurationsklasse.

einfach

$tablePages = 'orweb_pages'; 

einschließlich Ihrem variablen lokalen Bereich geben, damit es nicht in anderen Klassen sichtbar. Wenn Sie eine Konstante verwenden:

TABLE_PAGES wird für Lesezugriff in der gesamten Anwendung verfügbar sein, unabhängig vom Umfang.

Der Vorteil einer Konstante gegenüber einer globalen Variablen besteht darin, dass Sie sich keine Sorgen darüber machen müssen, dass sie in anderen Bereichen der Anwendung überschrieben wird.

+0

müssen Konstanten notwendigerweise volle Caps sein oder ist es nur eine Programmierpraxis, um alltägliche Identifiziererzusammenstöße zu vermeiden? – OrangeRind

+0

Nur gängige Praxis – jcoffey

+0

ist das Scope-Problem auch für Funktionen außerhalb der Klasse definiert? – OrangeRind

9

Verwenden Sie die global keyword:

In der Datei, in der Sie den Wert sind zuweisen.

global $tablePages; 
$tablePages = 'orweb_pages'; 

Und in der anderen Datei:

class URIResolve { 
    var $category; 
    function process_uri() { 
    global $tablePages; 
    $this->category = $tablePages; 
    } 
} 

Auch alle globalen Variablen in der $GLOBALS Array zur Verfügung stehen (die selbst Superglobal ist), so dass Sie die globale Variable überall der Zugriff ohne Verwendung globales Schlüsselwort, indem Sie etwa Folgendes tun:

$my_value = $GLOBALS['tablePages']; 

Dies dient auch dazu, den Wert des globalen versehentlich zu überschreiben. Im vorherigen Beispiel würden alle Änderungen, die Sie an $tablePages vorgenommen haben, die globale Variable ändern. Mancher Sicherheitsfehler wurde erzeugt, indem man eine globale $user hat und sie mit einer leistungsfähigeren Benutzerinformation überschreibt. Ein weiterer

, noch sicherer Ansatz ist die Variable im Konstruktor URIResolve zu bieten:

class URIResolve { 
    var $category; 

    function __construct ($tablePages) { 
    $this->category= $tablePages; 
    } 

    function process_uri() { 
    // Now you can access table pages here as an variable instance 
    } 
} 

// This would then be used as: 
new URIResolve($tablePages); 
+0

Vielen Dank! Zweifel: Ich muss $ GLOBALS ['tablePages'] = 'tablePages' manuell deklarieren; Recht? – OrangeRind

+0

Ich mag den letzten Tipp an den Konstruktor übergeben. Wichtig. Daumen hoch. – andho

0
<?php 
//Use variable php : $GLOBALS in __construct 
$x = "Example variable outer class"; 

class ExampleClass{ 
    public $variables; 
    function __construct() 
    { 
    $this->variables = $GLOBALS; //get all variables from $GLOBALS 
    } 
    // example get value var 
    public function UseVar(){ 
    echo $this->variables['x']; // return Example variable outer class 
    } 
    // example set value var 
    public function setVar(){ 
    $this->variables['x'] = 100; 
    } 
} 
echo $x // return Example variable outer class; 

$Example = new ExampleClass(); 
$Example->UseVar(); // return Example variable outer class 
$Example->setVar(); // $x = 100; 

// or use attr variables 
echo $Example->variables['x']; // 100 
$Example->variables['x'] = "Hiii"; 
?> 
+0

Im Allgemeinen sind die Antworten viel nützlicher, wenn sie eine Erläuterung dazu enthalten, was der Code bewirken soll. – Peter

Verwandte Themen