Sınıfını genişleten PHP OOP veritabanı bağlantısı erişemiyor

2 Cevap php

Belki sen yardımcı olabilirsin. Ben bir MySql bağlantı oluşturur bir ana sınıfı var. Sonra bu sınıfı genişletir. Ben bir veli :: __construct () yaptım sürece bağlantıyı erişmek mümkün değildi; Bu yaparken ve geçenlerde ben bağlantıları dışarı bir hata mesajı aldım.

Peki nasıl bu yüzden bağlantıların dışında çalışmaz ve veritabanı bağlantısı erişebilir bu programı yok.

class Common 
{
    var $mysql;

    function __construct()
    {	
    	$this->mysql=new mysqli($this->dbHOST, $this->dbUSERNAME, $this->dbPASSWORD, $this->dbNAME);
    }
}

class Role extends Common {

    function __construct()
    {
    	parent::__construct();
    }
}

2 Cevap

Ben senin sınıf yapısı ile temel bir sorun olduğunu düşünüyorum: Nesne başına bir bağlantı gerekmez, yalnızca nesne başına bağlantı kaynağın bir kopyasını gerekir.

Bunun dışında benim tercih edilen yolu bir tek çağrı sahip bir veritabanı işleyicisi oluşturmak için olduğunu. Şimdi her yerde çağrılabilir ve her zaman aynı bağlantı işleyicisi dönecektir. Bu da otomatik başlatmayı gizlemek için mükemmel bir yoldur.

Çözelti bir sınıf representing bir veritabanı satırı aslında o is, bir veritabanı bağlantısı bir sınıf oldukça farklıdır gerçekleşmesi karşılanır oldu. Her zamankinden daha fazla bağlantı ile ilgileneceğiz eğer bir app, nadiren çok sayıda satır ile anlaşma ama olacaktır. Bunu anlatmanın başka bir yolu IS-A ve HAS-A tanımları arasındaki fark şudur: "Bir veritabanı satır sınıf IS-A veritabanı bağlantısı" demek mantıklı değil. Bu "bir datbase satır sınıfı HAS-A veritabanı bağlantısı" demek için mantıklıdır.

Eğer nesne yok bağlantıyı kapatmak emin olun. Bu bağlantıyı kapatır bir __destruct() yöntem eklemek olduğunu.

Common sınıfı, __construct() yönteminde bağlantıyı açar biri ise, o zaman da __destruct() yönteminde kapatmak için bir olmalıdır. Eğer Role sınıfında bir __destruct() yöntemini tanımlamak yoksa PHP otomatik olarak ebeveynin __destruct() aramak olmayacak gibi, o zaman görünüyor. (Gerçi bu test değil.) Basit bir çözüm saplama sadece parent::__destruct() çağırır __destruct() yöntemi eklemektir.