使用PHP在整个站点中使用对象的实例

时间:2010-04-28 18:30:10

标签: php class object instance

我如何使用最初在整个网站上加载的对象实例?

我希望$ myinstance可以在任何地方使用。

$myinstance = new TestClass();

谢谢!

4 个答案:

答案 0 :(得分:6)

您要找的是singleton pattern.

如果你深入研究OOP架构,并且希望将来做单元测试:Singletons被认为是一种不完美的方法,而不是OOP意义上的“纯粹”。我曾就这个问题问a question,并用其他更好的模式得到了不错的结果。很多好读。

如果您只想开始使用某些内容,并且需要在任何地方都使用您的数据库类,请使用Singleton。

答案 1 :(得分:0)

您只需要在全局范围内声明变量(例如,在整个代码的开头),并且当您想在函数内部使用它时,请使用“global”语句。请参阅http://php.net/global

答案 2 :(得分:0)

我不是百分百肯定我得到了你想做的......但我还是试着回答。

我认为你可以将它保存到会话变量中,使用serialize / unserialize函数来保存/检索你的类实例。可能你会将TestClass编码为单例,但这实际上取决于你想要做什么。

例如:

if (!isset($_SESSION["my_class_session_var"])) // The user is visiting for the 1st time
       {
       $test = new TestClass();
       // Do whatever you need to initialise $test...
       $_SESSION["my_class_session_var"] = serialize($test);
       }
 else   // Session variable already set. Retrieve it
       {
       $test = unserialize($_SESSION['my_class_session_var']);
       }

答案 3 :(得分:0)

有一种名为Singleton的设计模式。简而言之:

将__construct和__clone更改为private,因此调用new TestClass()将以错误结束!

现在创建一个类,它将创建对象的新实例或返回现有实例...

示例:

abstract class Singleton
{
  final private function __construct()
  {
    if(isset(static::$instance)) {
      throw new Exception(get_called_class()." already exists.");
    }
  }

  final private function __clone()
  {
    throw new Exception(get_called_class()." cannot be cloned.");
  }

  final public static function instance()
  {
    return isset(static::$instance) ? static::$instance : static::$instance = new static;
  }
}

然后尝试扩展此类并定义静态$ instance变量

class TestClass extends Singleton
{
  static protected $instance;


  // ... 
}

现在试试这个:

echo get_class($myinstance = TestClass::instance();
echo get_class($mysecondinstance = TestClass::instance());

完成