Bir sınıf içinde her fonksiyon için global bir değişken erişilebilir hale

7 Cevap php

Ben SİSTEMİ tanımlanmış bir sabittir ${SYSTEM} adlı küresel kapsamı, bir değişken var. Ben bu değişkene erişimi olması gerekir fonksiyonları ile sınıfların bir sürü var ve ben o sataşmak global ${SYSTEM}; her zaman ilan buluyorum.

Ben bir sınıf değişkeni bildirmek çalıştı: public ${SYSTEM} = $GLOBALS[SYSTEM]; ama ben bu şekilde sınıf değişkenleri bildirir ve iyi çalışıyor görünüyor başka bir sınıf var çünkü bu tuhaf bir sözdizimi hatası ile sonuçlanır. Aklıma tek şey sabit kabul ediliyor olmasıdır.

Ben bir kurucu ile bu çekin başardık ama bu başvurmadan önce daha basit bir çözüm arıyorum.


EDIT The global ${SYSTEM} variable is an array with a lot of other child arrays in it. Unfortunately there doesn't seem to be a way to get around using a constructor...

7 Cevap

Tamam, umarım size ulaşmak için çalışıyoruz ne yüreğin var

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

?>

Böyle bir kurucu kullanabilirsiniz:

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

EDIT: Teşekkür yazım hatası işaret için, Peter!

Bu da bir dizi için çalışır. Atama istenmiyorsa, referans alarak da çalışır:

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

EDIT2: Aşağıdaki kod, bu yöntem test etmek için kullanılır ve bu benim sistem üzerinde çalıştı:

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

Bu benim küresel olmadan küresel şeylere erişmek nasıl.

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 şimdi exampleGetInstance sınıfı örneği için bir referanstır.

Sabit biçimlendirme

Üye değişkenler direkt özellikleri (class {public $membervar = $outsidevar;} de geçersiz) diğer değişkenlere herhangi bir referans içeremez. Bunun yerine bir kurucu kullanabilirsiniz.

Eğer bir sabit ile ilgileniyor Ancak, neden php en constant veya class constant imkanları kullanmak değil mi?

Buradan gerçekten out-of-the-sıradan bir şey yapmaya çalışıyoruz, o yüzden garip olmasını bekleyebilirsiniz. Globalleri ile çalışma SYSTEM sabit kullanarak dinamik isim seçimi ile keyifli, özellikle değil asla. Şahsen ben her yerde yerine $GLOBALS[SYSTEM] kullanmanızı tavsiye, ya da ... istiyorum

$sys = $GLOBALS[SYSTEM];

... Sen çok kullanmak için gidiyoruz eğer.

Bir dereceye kadar o cepten çevrelerinde hoş karşılanmaz rağmen Ayrıca, singleton deseni deneyebilirsiniz, yaygın sınıfların global değişken olarak adlandırılır.

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

?>

Bu örnek biraz wikipedia değiştirilmiş, ancak fikir edinebilirsiniz. Daha fazla bilgi için singleton deseni Googling deneyin

Ben bana öne ilk iki şey söylemek istiyorum:

  1. Sen değişken adı etrafında parantezler gerekmez, sadece kamu $ sistemi veya kamu $ Sistem yapabilirsiniz.
  2. PHP her zaman gerekli olmayabilir iken kullandığınız dize bir noktada sabit hale durumunda tek veya çift tırnak olmayan sayısal dizi indeksleri saklanması için standart bir uygulamadır.

Bu sizin için ne arıyorsanız olmalı

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

Ayrıca yerine olurdu sınıf sabitleri kullanabilirsiniz

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

Bu 'SomeClass :: SİSTEMİ' ile dışarıdan 'self :: SİSTEMİ' ve sınıf içinde başvurulabilir.