"Dizi zincirleme" için en iyi çözüm

0 Cevap php

Benim proje için ben bir. Ini dosyadan veri yükler küçük bir yapılandırma sınıfı yazdı. Bu yapılandırma değerleri (sadece okunur) için basitleştirilmiş erişim sağlamak için sihirli __ get () metodu üzerine yazar.

Örnek config.ini.php:

;<?php exit; ?>
[General]
auth = 1
user = "halfdan"

[Database]
host = "127.0.0.1"

Benim yapılandırma sınıfı (singleton pattern - burada basitleştirilmiş) bu gibi görünüyor:

class Config {
    protected $config = array();

    protected function __construct($file) {
        // Preserve sections
        $this->config = parse_ini_file($file, TRUE);
    }

    public function __get($name) {
        return $this->config[$name];
    }
}

Yapılandırma yükleniyor böyle bir dizi yapıyı da oluşturmak istiyoruz:

array(
  "General" => array(
    "auth" => 1,
    "user" => "halfdan"
  ),
  "Database" => array(
    "host" => "127.0.0.1"
  )
)

Bu Config::getInstance()->General yaparak dizinin ilk seviyesine erişmek mümkün, ve kullanarak değerleri Config::getInstance()->General['user']. Ben gerçekten ne istiyorum ama Config::getInstance()->General->user (sözdizimsel şeker) yaparak bütün yapılandırma değişkenleri erişmek mümkün ediliyor. "->" Üzerinde tanımlı değil, bu yüzden bu sadece başarısız olur. Dizisi bir nesne ve değil

Ben bir çözüm düşündüm ve bu konuda bazı kamu görüş almak istiyorum:

class Config {
  [..]
  public function __get($name) {
    if(is_array($this->config[$name])) {
      return new ConfigArray($this->config[$name]);
    } else {
      return $this->config[$name];
    }
  }
}

class ConfigArray {
  protected $config;

  public function __construct($array) {
    $this->config = $array;
  }

  public function __get($name) {
    if(is_array($this->config[$name])) {
      return new ConfigArray($this->config[$name]);
    } else {
      return $this->config[$name];
    }
  }
}

Bu bana zincir benim yapılandırma erişim sağlayacak. PHP 5.3 kullanıyorum gibi aynı zamanda ConfigArray ArrayObject (SPL 5.3 varsayılan başına aktive edilir) uzatmak izin vermek iyi bir fikir olabilir.

Herhangi bir öneri, gelişmeler, yorumlar?

0 Cevap