2009-02-06 12 views
12

Mam zmienną w zasięgu globalnym o nazwie ${SYSTEM}, gdzie SYSTEM jest zdefiniowaną stałą. Mam wiele klas z funkcjami, które muszą mieć dostęp do tej zmiennej, i uważam to za denerwujące, ogłaszając za każdym razem global ${SYSTEM};.Tworzenie zmiennej globalnej dostępnej dla każdej funkcji w klasie

Próbowałem zadeklarować zmienną klasy: public ${SYSTEM} = $GLOBALS[SYSTEM];, ale powoduje to błąd składni, który jest dziwny, ponieważ mam inną klasę, która deklaruje zmienne klasy w ten sposób i wydaje się działać dobrze. Jedyne, co mogę myśleć, to to, że stała nie jest rozpoznawana.

Udało mi się to zrobić za pomocą konstruktora, ale szukam prostszego rozwiązania, zanim się do tego zastosuję.


EDIT globalne $ {SYSTEM} zmienna jest tablicą z wielu innych tablic podrzędnych w nim. Niestety nie ma sposobu na obejście za pomocą konstruktora ...

Odpowiedz

1

Bezpośrednia specyfikacja zmiennych członkowskich nie może zawierać żadnych odniesień do innych zmiennych (class {public $membervar = $outsidevar;} jest również nieważna). Zamiast tego użyj konstruktora.

Jednakże, jeśli masz do czynienia ze stałą, dlaczego nie używasz urządzeń php: constant lub class constant?

-2

Powiedziałbym pierwsze dwie rzeczy, które wyróżniają się na mnie są:

  1. Nie trzeba nawiasy wokół nazwy zmiennej, można po prostu zrobić publicznego systemu dolarów lub $ System publicznego.
  2. Chociaż PHP nie zawsze może tego wymagać, standardową praktyką jest hermetyzacja nieliczbowych indeksów tablicowych w pojedynczych lub podwójnych cudzysłowach, w przypadku gdy ciąg znaków, którego używasz, staje się w pewnym momencie stały.

ta powinna być co szukasz

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

Można również użyć klasy stałych, które zamiast być

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

ten można odwoływać się w klasie z „ja: : SYSTEM "i zewnętrznie z" SomeClass :: SYSTEM ".

+0

Czy to znaczy, o stałych> nazwy zmiennych? – atomicharri

+0

W pytaniu SYSTEM jest stałą, a nie nazwą zmiennej. – PolyThinker

+0

Nie wiem, o czym mówisz, ale $ {SYSTEM} zdecydowanie nie jest tym samym co $ SYSTEM ... – atomicharri

-1

Można również wypróbować wzór singletonowy, choć w pewnym stopniu jest on mile widziany w kręgach OOP, jest powszechnie określany jako globalna zmienna klas.

<?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(); 

?> 

Ten przykład jest nieco zmodyfikowany z Wikipedii, ale możesz uzyskać pomysł. Spróbuj googlowania z Singleton, aby uzyskać więcej informacji

+0

Nie widzę, jak to jest związane z singleton. – PolyThinker

+0

Jak to się nie dzieje? Wyjaśnienie wydaje się bardziej odpowiednie. – Asciant

2

Można użyć konstruktora tak:

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

EDIT: Dzięki za wskazanie literówkę, Peter!

Działa to również dla tablic.Jeśli zadanie nie jest pożądana, biorąc odniesienie działa również:

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

EDIT2: Poniższy kod został wykorzystany do przetestowania tej metody i to działało w moim systemie:

<?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

Czy to powinno być "$ this-> classvar = ..."? –

1

starasz się zrobić coś naprawdę nietypowego, więc możesz oczekiwać, że będzie to niezręczne. Praca z globaliami nigdy nie jest przyjemna, szczególnie przy dynamicznym wyborze nazwy przy użyciu stałej SYSTEM. Osobiście polecam użyć $GLOBALS[SYSTEM] wszędzie zamiast, albo ...

$sys = $GLOBALS[SYSTEM]; 

... jeśli masz zamiar go używać dużo.

8

Ok, mam nadzieję, że mam sens tego, co starasz się osiągnąć

<?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

ten sposób mogę uzyskać dostęp do rzeczy globalnie bez globalny.

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 jest odniesienie do wystąpienia exampleGetInstance klasy.

formatowania o stałej

+0

Dziękujemy! Działa świetnie! – 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

Jak to się tutaj ma znaczenie? – andho