代码之家  ›  专栏  ›  技术社区  ›  halfdan

“阵列链”的最佳解决方案

  •  4
  • halfdan  · 技术社区  · 14 年前

    对于我的项目,我编写了一个小的config类,它从.ini文件加载数据。它会覆盖magic_uuu get()方法,以便提供对(只读)配置值的简化访问。

    config.ini.php示例:

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

    我的配置类(singleton模式-这里简化)如下所示:

    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];
        }
    }
    

    加载配置将创建这样的数组结构:

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

    可以通过执行以下操作访问阵列的第一级 Config::getInstance()->General ,值使用 Config::getInstance()->General['user'] . 不过,我真正想要的是能够通过执行以下操作访问所有配置变量 Config::getInstance()->General->user (句法糖)。数组不是一个对象,并且未在其上定义“->”,因此这只会失败。

    我想到了一个解决办法,想得到一些公众意见:

    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];
        }
      }
    }
    

    这将允许我链接配置访问。当我使用php 5.3时,让configarray扩展可能也是一个好主意。 ArrayObject (SPL在5.3中默认激活)。

    有什么建议,改进,意见吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Bill Karwin    14 年前

    如果你的元素 $this->config 数组也是 Config 上课,然后就可以了。

    这个 Zend Framework 有一个他们调用的类似组件 Zend_Config . 你可以 download 并检查它们是如何实现的。他们不必一直延伸下去 ArrayObject .

    这个 Zend_Registry 类有类似的用法,它确实扩展了 数组对象 . 因此Zend_注册表的代码比较简单。

        2
  •  0
  •   Nebulosar Nutcracker    6 年前

    如果您希望在PHP中使用数组链接,那么您应该仔细研究一下 Chain . 这是一个非常小的项目,你可以使用像这样的链接方法 filter count 就像你在编码Java一样!

    $arr = array_filter(
        array_map(
            function ($v) { return rand(0, $v); },
            array_fill(0, 10, 20)
        ),
        function ($v) { return $v & 1; }
    );
    

    变成

    $chain = Chain::fill(0, 10, 20)
        ->map(function ($v) { return rand(0, $v); })
        ->filter(function ($v) { return $v & 1; });
    

    太棒了,对吧? 您可以在中找到更多信息 this blog .