Nasıl başlangıçta Tüm site genelinde yüklü bir nesnenin bir örneğini kullanacak?
Ben her yerde kullanılacak $ MyInstance istiyorum.
$myinstance = new TestClass();
Teşekkürler!
Ne arıyorsun denir singleton pattern.
Eğer OOP mimarisine derinden, ve gelecekte Birim Testi gibi şeyler yapmak istiyorum: Singletons kusurlu bir yaklaşım olarak kabul ve OOP anlamda "saf" değildir. Bir keresinde konuda a question sordu, ve diğer, daha iyi desenleri ile oldukça iyi sonuçlar aldım. Iyi okuma bir sürü.
Eğer sadece bir şey ile başlamak istiyorum, ve her yerde DB sınıf mevcut gerekiyorsa, sadece bir Singleton kullanın.
Sadece genel kapsamda (örneğin, bütün kod başında da) sizin değişkeni bildirmek gerekir, ve bir işlev içinde kullanmak istediğiniz zaman, "küresel" deyimini kullanın. Bkz http://php.net/global.
Ben yapmak istediğiniz ne var% 100 emin değilim ... ama yine de cevap çalışacağım.
Ben size sınıf örneğini almak / kaydetmek için serialize / unserialize fonksiyonlarını kullanarak, bir oturum değişkeni kaydedebilirsiniz düşünüyorum. Muhtemelen bir singleton olarak TestClass kod ediyorum, ama bu gerçekten yapmak çalıştığınız ne bağlıdır.
Örneğin:
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']);
}
Singleton adında bir tasarım deseni vardır. Kısacası:
Böylece () Hata ile sona erecek yeni TestClass çağırarak, özel için __ inşa ve __ klon değiştirin!
Şimdi nesnesinin yeni bir örneğini oluşturmak veya mevcut bir döner bir sınıf yapmak ...
Örnek:
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;
}
}
Sonra bu sınıfı genişletmek için çalışın ve statik $ örnek değişken tanımlamak
class TestClass extends Singleton
{
static protected $instance;
// ...
}
Şimdi bu deneyin:
echo get_class($myinstance = TestClass::instance();
echo get_class($mysecondinstance = TestClass::instance());
Tamam