Php和注册表模式

时间:2014-11-11 10:34:41

标签: php

我有以下问题。我有一个包含login.php的Index.php。 在login.php中,我包含了一个registry.php。在login.php中,我将我的连接对象添加到注册表类(Registry :: add($ Conn));连接类的名称是' conn'。

因此,在显示页面(index.php)之后,用户可以单击按钮打开另一个页面(clients \ index.php)。在client \ index.php中我想使用相同的连接。我怎么做?当我使用Registry :: get(' conn')时,我收到对象不存在的消息。

<?php
class Registry {
  /**
   * @var array The store for all of our objects
   */
  static private $_store = array();

  /**
  private static $instance = null;

  public static function getInstance() {
     if(self::$instance === null) {
        self::$instance = new Registry();
     }

     return self::$instance;
  }  

  private function __construct() {}
  private function __clone() {}
  */

  /**
   * Add an object to the registry
   * 
   * If you do not specify a name the classname is used
   *
   * @param mixed $object The object to store
   * @param string $name Name used to retrieve the object
   * @return void
   * @throws Exception
   */
  static public function add($object, $name = null)
  {

    // Use the classname if no name given, simulates singleton
    $name = (!is_null($name)) ?: get_class($object);
    $name = strtolower($name);

    if (isset(self::$_store[$name])) {
      throw new Exception("Object already exists in registry");
    }

    echo 'Connection name:' . $name;

    self::$_store[$name]= $object;
    //Undefined offset: 61
  }

  /**
   * Get an object from the registry
   *
   * @param string $name Object name, {@see self::set()}
   * @return mixed
   * @throws Exception
   */
  static public function get($name)
  {
    if (!self::contains($name)) {
      throw new Exception("Object does not exist in registry");
    }

    return self::$_store[$name];
  }

  /**
   * Check if an object is in the registry
   *
   * @param string $name Object name, {@see self::set()}
   * @return bool
   */
  static public function contains($name)
  {
    if (!isset(self::$_store[$name])) {
      return false;
    }

    return true;
  }

  /**
   * Remove an object from the registry
   *
   * @param string $name Object name, {@see self::set()}
   * @returns void
   */
  static public function remove($name)
  {
    if (self::contains($name)) {
      unset(self::$_store[$name]);
    }
  }
}
?>

1 个答案:

答案 0 :(得分:0)

因此,有几种方法可以做到。

First :(因为代号不是很好的变种):

client/index.php

您需要重新设置连接。 Registry::add($Conn)

Second:如果您使用某个框架,则只需在脚本运行client/index控制器或文件之前添加它(这取决于您使用的是什么)。

因此,如果您想从Registry获取连接对象,则需要根据每个请求设置它。

此外,对于连接,您可以使用静态方法,例如app::getConnection(),在其中您可以检查连接是否已经存在,如果没有,则返回,创建一个新方法,而不使用注册表模式。