我如何使用最初在整个网站上加载的对象实例?
我希望$ myinstance可以在任何地方使用。
$myinstance = new TestClass();
谢谢!
答案 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());
完成