Ölümcül bir hata vererek PHP statik nesneleri

2 Cevap oop

Ben şu PHP kodu var;

<?php

component_customer_init();
component_customer_go();


function component_customer_init()
{
    $customer = Customer::getInstance();
    $customer->set(1);
}
function component_customer_go()
{
    $customer = Customer::getInstance();
    $customer->get();
}

class Customer
{
    public $id;
    static $class = false;
    static function getInstance()
    {
        if(self::$class == false)
        {
                self::$class = new Customer;
        }
        else
        {
                return self::$class;
        }
    }


    public function set($id)
    {
        $this->id = $id;
    }

    public function get()
    {
        print $this->id;
    }

}
?>

Ben şu hatayı alıyorum;

Ölümcül hata:. Olmayan bir nesne hat 9 üzerinde / .. / sınıfları / customer.php bir üye fonksiyon seti () Çağrı

Ben bu hatayı alıyorum neden kimse bana söyleyebilir misiniz? Ben bu kod garip görünebilir biliyorum, ama ben bir CMS için yazıyorum bir bileşen sistemine dayanıyor. Amaç şablon örneğin HTML etiketleri değiştirmek için edebilmek için;

<!-- component:customer-login -->

ile;

<?php component_customer_login(); ?>

Ben de çıktı vs yapılmadan önce formları doğrulamak için "Müşteri" sınıf öncesi render yöntemleri aramak gerekiyor

Herkes daha iyi bir yol düşünemiyorum varsa, lütfen bana bildirin ama ilk etapta, ben yukarıda belirtilen "Ölümcül hata" almak neden bilmek istiyorum.

2 Cevap

Peki, ben senin Customer::getInstance() yöntemi kusurlu olduğunu düşünüyorum. Bu gibi görünmelidir:

...
static function getInstance()
{
    if(self::$class == false)
    {
            self::$class = new Customer;
            return self::$class; // ADDED!!
    }
    else
    {
            return self::$class;
    }
}
....

if(self::$class == false) dalında sınıfın örneğini oluştururken, ancak bunu iade yok.

Ayrıca bu şekilde yazabiliriz:

static function getInstance()
{
    if(self::$class == false)
    {
        self::$class = new Customer; 
    }

    return self::$class;
}

Biraz daha kısa yapmak için.

KURU: Kendinizi tekrarlayın etmeyin

static function getInstance()
{
    if(self::$class == false)
    {
        self::$class = new Customer;
    }
    return self::$class;
}

Ve Sinlgetons için kullanılan ikinci __ clone () önlemek için de önemlidir. Bu özel bu sorunu çözmek gerekir yapma:

private function __clone() {}