2009-02-06 12 views
12

Ich habe eine Variable auf dem globalen Bereich, der ${SYSTEM} benannt wird, wobei SYSTEM eine definierte Konstante ist. Ich habe viele Klassen mit Funktionen, die Zugriff auf diese Variable haben müssen und ich finde es nervig, jedesmal global ${SYSTEM}; zu deklarieren.Eine globale Variable für jede Funktion innerhalb einer Klasse zugänglich machen

Ich versuchte, eine Klassenvariable zu deklarieren: public ${SYSTEM} = $GLOBALS[SYSTEM];, aber dies führt zu einem Syntaxfehler, der seltsam ist, weil ich eine andere Klasse habe, die Klassenvariablen auf diese Weise deklariert und scheint gut zu funktionieren. Das einzige, was mir einfällt, ist, dass die Konstante nicht erkannt wird.

Ich habe es geschafft, dies mit einem Konstruktor zu machen, aber ich suche nach einer einfacheren Lösung, bevor ich darauf zurückzugreifen.


EDIT Die global $ {SYSTEM} Variable ist ein Array mit vielen anderen Kind-Arrays in ihm. Leider scheint es keine Möglichkeit zu geben, einen Konstruktor zu verwenden ...

Antwort

1

Die direkte Spezifikation von Elementvariablen darf keine Referenzen auf andere Variablen enthalten (class {public $membervar = $outsidevar;} ist ebenfalls ungültig). Verwenden Sie stattdessen einen Konstruktor.

Da Sie jedoch mit einer Konstante zu tun haben, warum verwenden Sie nicht die constant oder class constant Einrichtungen?

-2

Ich würde sagen, die ersten beiden Dinge, die mir auffallen, sind:

  1. Sie brauchen nicht die Klammern um den Variablennamen, können Sie einfach tun public $ System oder public $ SYSTEM.
  2. Während PHP es nicht immer erfordert, ist es üblich, nichtnumerische Array-Indizes in einfache oder doppelte Anführungszeichen zu kapseln, falls die von Ihnen verwendete Zeichenfolge irgendwann zu einer Konstante wird.

Dies sollte das sein, was Sie suchen

class SomeClass { 
    public $system = $GLOBALS['system']; 
} 

Sie können auch Klasse Konstanten verwenden, die anstelle

class SomeClass { 
    const SYSTEM = $GLOBALS['system']; 
} 

innerhalb der Klasse referenziert werden mit Selbst Dies kann sein würde: : SYSTEM 'und extern mit' SomeClass :: SYSTEM '.

+0

dass Konstanten> Variablennamen bedeutet das? – atomicharri

+0

In der Frage ist SYSTEM eine Konstante, kein Variablenname. – PolyThinker

+0

Ich weiß nicht, wovon Sie reden, aber $ {SYSTEM} ist definitiv nicht dasselbe wie $ SYSTEM ... – atomicharri

-1

Sie könnten auch das Singleton-Muster versuchen, obwohl es in OOP-Kreisen bis zu einem gewissen Grad verpönt ist, wird es allgemein als die globale Variable von Klassen bezeichnet.

<?php 
class Singleton { 

    // object instance 
    private static $instance; 

    // The protected construct prevents instantiating the class externally. The construct can be 
    // empty, or it can contain additional instructions... 
    protected function __construct() { 
    ... 
    } 

    // The clone and wakeup methods prevents external instantiation of copies of the Singleton class, 
    // thus eliminating the possibility of duplicate objects. The methods can be empty, or 
    // can contain additional code (most probably generating error messages in response 
    // to attempts to call). 
    public function __clone() { 
    trigger_error('Clone is not allowed.', E_USER_ERROR); 
    } 

    public function __wakeup() { 
    trigger_error('Deserializing is not allowed.', E_USER_ERROR); 
    } 

    //This method must be static, and must return an instance of the object if the object 
    //does not already exist. 
    public static function getInstance() { 
    if (!self::$instance instanceof self) { 
     self::$instance = new self; 
    } 
    return self::$instance; 
    } 

    //One or more public methods that grant access to the Singleton object, and its private 
    //methods and properties via accessor methods. 
    public function GetSystemVar() { 
    ... 
    } 
} 

//usage 
Singleton::getInstance()->GetSystemVar(); 

?> 

Dieses Beispiel ist leicht von Wikipedia abgeändert, aber Sie können die Idee bekommen. Versuchen Sie, die Singletonmuster für weitere Informationen googeln

+0

Ich sehe nicht, wie das mit Singleton zusammenhängt. – PolyThinker

+0

Wie hängt es nicht zusammen? Eine Erklärung erscheint angemessener. – Asciant

2

Sie einen Konstruktor wie diese verwendet:

class Myclass { 
    public $classvar; 
    function Myclass() { 
    $this->classvar = $GLOBALS[SYSTEM]; 
    } 
} 

EDIT: Danke für den Hinweis auf die Tippfehlern, Peter!

Dies funktioniert auch für Array.Wenn Zuordnung nicht erwünscht ist, auch die Referenz genommen funktioniert:

$this->classvar =& $GLOBALS[SYSTEM]; 

EDIT2: Der folgende Code wurde verwendet, um dieses Verfahren zu testen und es funktionierte auf meinem System:

<?php 
define('MYCONST', 'varname'); 
$varname = array("This is varname", "and array?"); 

class Myclass { 
    public $classvar; 
    function Myclass() { 
    $this->classvar =& $GLOBALS[MYCONST]; 
    } 
    function printvar() { 
    echo $this->classvar[0]; 
    echo $this->classvar[1]; 
    } 
}; 

$myobj = new Myclass; 
$myobj->printvar(); 
?> 
+0

Sollte das '$ this-> classvar = ...' sein? –

1

Sie versuchen zu tun etwas wirklich Außergewöhnliches hier, also kann man erwarten, dass es peinlich ist. Das Arbeiten mit Globals ist nie angenehm, besonders nicht bei der dynamischen Namensauswahl mit SYSTEM Konstante. Persönlich würde ich Sie $GLOBALS[SYSTEM] überall statt, oder ...

$sys = $GLOBALS[SYSTEM]; 

verwenden empfehlen ... wenn du es wirst eine Menge verwenden.

8

Ok, hoffentlich habe ich den Kern bekam, was Sie versuchen

<?php 
    // the global array you want to access 
    $GLOBALS['uname'] = array('kernel-name' => 'Linux', 'kernel-release' => '2.6.27-11-generic', 'machine' => 'i686'); 

    // the defined constant used to reference the global var 
    define(_SYSTEM_, 'uname'); 

    class Foo { 

     // a method where you'd liked to access the global var 
     public function bar() { 
      print_r($this->{_SYSTEM_}); 
     } 

     // the magic happens here using php5 overloading 
     public function __get($d) { 
      return $GLOBALS[$d]; 
     } 

    } 

    $foo = new Foo; 
    $foo->bar(); 

?> 
8

Dies ist, wie ich die Dinge zu erreichen global ohne globale zugreifen.

class exampleGetInstance 
{ 

private static $instance; 

public $value1; 
public $value2; 


private function initialize() 
{ 
    $this->value1 = 'test value'; 
    $this->value2 = 'test value2'; 

} 

public function getInstance() 
{ 
    if (!isset(self::$instance)) 
    { 
     $class = __CLASS__; 
     self::$instance = new $class(); 
     self::$instance->initialize(); 
    } 
    return self::$instance; 
} 

} 

$myInstance = exampleGetInstance::getInstance(); 

echo $myInstance->value1; 

$myInstance ist nun eine Referenz auf die Instanz der Klasse exampleGetInstance.

Feste Formatierung

+0

Danke! Es funktioniert super! – wormhit

-2
class Dateutility { 

    public $a,$b; 
    public function getCurrentTime() { 
     date_default_timezone_set("Asia/Karachi"); 
     echo "The current time is: "; 
     echo date("g:i a"); 
    } 

    public function seta($c) { 
     $a=$c; 
     echo "<br/>value of a is:".$a; 
    } 

    public function setb($d) { 
     $b=$d; 
     echo "value of b is:".$b; 
    } 

} 

$vari = new Dateutility;   
$vari->getCurrentTime(); 

$vari->seta(10); 
$vari->setb(20); 
+2

Wie ist das hier relevant? – andho