访问子对象的语法选择

访问子对象的语法选择

问题描述:

我想知道哪里是我的选择在语义和技术上最优化。我创建了一个简单的对象注册表类,但对象访问方法让我想知道什么是最好的。我目前使用的第一个变化:访问子对象的语法选择

//the Registry methods can chain, each returning a self reference 
$registry = Registry::getInstance()->register('myObject', new Object); 

//accessing a registered object method 
//in various possible ways 
Registry::getInstance()->myObject->method();  //1 
Registry::getInstance()->use('myObject')->method(); //2 
$registry('myObject')->method();     //3 
  • 第一种变体使用__get()魔法,用流利的语法一致。
  • 第二次使用'获取器'方法use()
  • 第三次使用__invoke()魔法,有人建议,但我不太喜欢。

我只是想知道,如果任何人有洞察力,或建议使用任何(或不使用)这些选项。在我的情况下使用注册表类的原因是提供伪关键对象的全球化,用于嵌套关闭(声明它们与use每次都很麻烦)

这有点与我的另一个问题有关,在PHP closures and implicit global variable scope

感谢提前:)

+1

另一个相当不错的选择是实现ArrayAccess接口,所以你可以使用'$ registry ['myObject'] - > method();'。但是,为了提高效率,如果要对其执行多个操作,则需要缓存'myObject',例如'$ myObject = $ registry ['myObject'];' – connec 2011-03-27 14:46:34

我个人的意见是使用你的第二个和第三个代码示例的组合。同时使用(或者只有你的第二个例子),你可以使用phpDoc来保持自动完成。

下面是一个例子:

<?php 

class Session { 
    public function register() { 
    } 
} 

/** 
* @property Session $session 
*/ 
class Registry { 
    private $_classes = array(); 

    public function __set($key, $value) { 
     $key = (string) $key; 
     if ((null === $value) && isset($this->_classes[$key])) { 
      unset($this->_classes[$key]); 
     } elseif (null !== $value) { 
      $this->_classes[$key] = $value; 
     } 
    } 

    public function __get($key) { 
     $key = (string) $key; 
     if (isset($this->_classes[$key])) { 
      return $this->_classes[$key]; 
     } 

     switch ($key) { 
      case 'session': 
       $this->_classes[$key] = new Session(); 
       break; 
     } 

     return $this->_classes[$key]; 
    } 
} 

$registry = new Registry(); 
$registry->session->register(); 

如果我给你一个提示,为什么我的注册表类不遵循单例模式...如果你想运行单位 - 避免使用单例模式试验。看到这里:http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html