2009-02-06 2 views
12

У меня есть переменная в глобальной области, которая называется ${SYSTEM}, где SYSTEM является определенной константой. У меня есть много классов с функциями, которые должны иметь доступ к этой переменной, и я нахожу это раздражающим объявление global ${SYSTEM}; каждый раз.Создание глобальной переменной, доступной для каждой функции внутри класса

Я попытался объявить переменную класса: public ${SYSTEM} = $GLOBALS[SYSTEM];, но это приводит к синтаксической ошибке, которая является странной, потому что у меня есть другой класс, который объявляет переменные класса таким образом и, кажется, работает нормально. Единственное, о чем я могу думать, это то, что константа не распознается.

Мне удалось снять это с помощью конструктора, но я ищу более простое решение, прежде чем прибегать к этому.


EDIT Глобальные $ {SYSTEM} переменная представляет собой массив с большим количеством других дочерних массивов в нем. К сожалению, не существует способа обойти использование конструктора ...

ответ

1

Прямая спецификация переменных-членов не может содержать ссылок на другие переменные (class {public $membervar = $outsidevar;} также недействительна). Вместо этого используйте конструктор.

Однако, поскольку вы имеете дело с константой, почему бы вам не использовать функции php constant или class constant?

-2

Я бы сказал, что первые две вещи, которые выделяются для меня являются:

  1. Вам не нужны скобки имя переменной, вы можете просто сделать $ системы государственного или общественного $ SYSTEM.
  2. Хотя PHP может не всегда требовать этого, стандартная практика заключается в инкапсуляции индексов нечислового массива в одинарные или двойные кавычки, если используемая вами строка становится константой в какой-то момент.

Это должно быть то, что вы ищете

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

Вы можете также использовать константы класса, который бы вместо того, чтобы быть

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

Это можно ссылаться в классе с «я: : SYSTEM 'и снаружи с «SomeClass :: SYSTEM».

+0

Это значит, что константы> имена переменных? – atomicharri

+0

В вопросе SYSTEM является константой, а не именем переменной. – PolyThinker

+0

Я не знаю, о чем вы говорите, но $ {SYSTEM} определенно не совпадает с $ SYSTEM ... – atomicharri

-1

Вы также можете попробовать одноэлементный шаблон, хотя в некоторой степени он нахмурился в кругах ООП, его обычно называют глобальной переменной классов.

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

?> 

Этот пример немного модифицирован из Википедии, но вы можете получить эту идею. Попробуйте прибегая к помощи одноплодному шаблону для получения дополнительной информации

+0

Я не вижу, как это связано с синглтоном. – PolyThinker

+0

Как это не связано? Объяснение представляется более уместным. – Asciant

2

Вы можете использовать конструктор, как это:

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

EDIT: Спасибо за указание на опечатке, Питер!

Это также работает для массива.Если задание не требуется, принимая ссылку также работает:

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

EDIT2: Следующий код был использован для тестирования этого метода, и она работала на моей системе:

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

Должно ли это быть '$ this-> classvar = ...'? –

1

Вы пытаетесь сделать что-то действительно необычное здесь, поэтому вы можете ожидать, что это будет неудобно. Работа с globals никогда не бывает приятной, особенно не с вашим динамическим названием с использованием константы SYSTEM. Лично я рекомендую вам использовать $GLOBALS[SYSTEM] везде вместо этого, или ...

$sys = $GLOBALS[SYSTEM]; 

... если вы собираетесь использовать его много.

8

Хорошо, надеюсь, у меня есть суть того, что вы пытаетесь достичь

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

Это как получить доступ к вещам глобально без глобального.

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 теперь ссылка на экземпляр класса exampleGetInstance.

Исправлено форматирование

+0

Спасибо! Он отлично работает! – 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

Как здесь уместно? – andho