Diğer nesneleri de dahil olmak üzere PHP nesneleri

6 Cevap php

Ben başlık doğru olduğunu düşünüyorum ama bu yanlış lider ise beni düzeltin lütfen.

Sorun: Ben, DB sınıfını kullanmak isteyen bir sınıf var şimdi yerine zorunda "global $ db;" Her yöntemde benim sınıf özelliklerinde nesne başvurusu yerleştirmek mümkün olmak istiyorum DB nesneyi kullanmak istiyoruz.

Hala şu? Tamam buraya:

class user
{
    private $id = 0;
    private $name = NULL;
    private $password = NULL;
    private $db;

    function __construct()
    {
        $this->load_db();
    }

    private function load_db()
    {
        global $db;
        $this->$db =& $db;
    }

Ben PHP var türünü ayarlamak için nasıl anlamaya olamaz gibi bir hata can sıkıcı bir "sınıf db Nesne dizeye dönüştürülür olamazdı" olsun ...

Şimdi soru iki yönlüdür:

1) How do I fix this. or 2) Is there a better way of doing it as this feels really "kack-handed".

Teşekkür peşin,

Dorjan

edit: Sadece ben aynı DB nesne birden çok örneğini yapmak istemiyorum net değilim emin olmak için. En azından ben bu iyi bir uygulama olduğuna inanıyorum ^ ^

6 Cevap

Eğer $ bu kullanıyorsanız, yalnızca bir dolar işareti gerekir. Yani $this->db.

private function load_db()
{
        global $db;
        $this->db =& $db;
}

Eğer php 5 kullanıyorsanız Ayrıca eğer nesneler örtük referans geçti çünkü =& operatörünü kullanmanız gerekmez. İkincisi, yapıcı $db enjekte ya da bunun yerine global kullanarak bir kayıt nesnesi onu getir gerekir.

Daha iyi yapmak gerekir

class User
{
    private $id = 0;
    private $name = NULL;
    private $password = NULL;
    private $db;

    function __construct($db=null)
    {
        $this->db = $db;
    }

}

Eğer $object-> aracılığıyla özelliklerine erişim eğer değişken isimleri önce $ koymak unutmayın. Hata geliyor olmasıdır.

Eğer bir şekilde küresel değişken için sınıf kravat gibi bir sınıf yöntemi içinde bir küresel kullanmak için gerçekten kötü bir uygulamadır. Iyi kurucusuna bir parametre veya bir yöntem olarak geçmektedir.

Daha sonra birlikte sınıfı örneğini

$user = new User($db)

Ayrıca harfle kongre başlangıç ​​tarafından bu sınıf adlarını unutmayın.

Bu:

$this->db

Yapıcı aracılığıyla db örneği enjekte

public function __construct($db)
{
    $this->db = $db;
}

dependency injection denilen bir şey kullanmak istiyorum Yopu'll. Eğer nesne yapar ne olursa olsun yapmak için başka bir nesne içine bir nesne "enjekte" yerdir. Bu durumda veritabanı şeyler yapmak

class user { private $id = 0; private $name = NULL; private $password = NULL; private $db;

function __construct($database_object)
{
    $this->load_db();
    $this->$db = $database_object;
}

public function do_db_stuff()
{
    $this->$db->doStuff();
}    

$db = new Mysql() 
$user = new User($db);
$user->do_db_stuff();