Diğer sınıflardan bir sınıf içinde bir işlev erişme

5 Cevap php

Ne yapmak istiyorum benim veritabanı sınıfı şeklinde anter sınıfı, sorgu fonksiyonuna ulaşmak olduğunu. Evey zaman bir sorgu ben onu alır zaman izlemek ve sorgu sayısını eklemek yapılır, ben tüm sorgunun için bunu yapmak istiyorum.

Şimdi sahip düzeni:

                Global
     -----------------------------
     |                           |
database class          application class
                                 |
                           program class

Veritabanı sınıfı veritabanına bağlanmak başlar ve bazı sorgu en yaptığında. Onun ihtiyacı dahaki sefere programı sınıftadır.

Ben querycount ve totalTime değişkenleri tutmak ve onlara eklemek gerekir. Ben de basit bir fonksiyon çağrısı istiyorum, ben her program için sınıf başlatmak istemiyorum. Uygulama sınıf düzeyinde diyoruz ve program düzeyinde ve sorgu işlevini kullanmak edebilmek için bir yol olmalı gibi yolunmuş küresel düzeyde bağlantı ve yakın.

Ben ne istediğimi biliyorum, bu mantıklı umut ama ben kelimeleri içine koyarak sorunları var ...

5 Cevap

Ben doğru sorununuzu anladım emin değilim ama o zaman sınıfı "hatırlamak" için istediğiniz verileri saklamak için kullanılan veritabanı sınıfa statik değişkenleri tanıtmak öneririm. Bu gibi:

class Database
{
public static $queryCount = 0;
public static $queryDuration = 0;

/*
  ... the rest of your database stuff
*/
}

Bu iki değişken Veritabanı :: $ queryCount ve Veritabanı üzerinden erişilebilir :: $ queryDuration ve örneklenen nesneler sınıfta kendi değerlerini korumak ve olmayacaktır.

Sorgu yöntemleri içinde kendi değerlerini gibi güncelleyebilirsiniz:

Database::$queryCount++;

ve senaryonun sonunda, onların içeriğini okuyabilirsiniz.

PHP'nin statik anahtar kelime bakmak gereken budur.

http://php.net/manual/en/language.oop5.static.php

Sınıfların çok size diş sorunları hakkında düşünmek gerekebilir statik yöntemlerini çağırarak se bile, dikkat edin.

Bir yolu hemen kullanabileceğiniz hangi sınıfların işlevleri statik yapmaktır. Diğer olasılık aramak istediğiniz işlevini içeren sınıf uzatmaktır. Ayrıca herhangi sınıftan bir işlevi çağırmak için call_user_func_array işlevini kullanabilirsiniz.

Her neyse bu videoyu bence sorunuzun cevabı:

http://www.killerphp.com/videos/calling_functions_from_another_class.php

Ben de, (kolay farklı veritabanı türleri için alt sınıfları oluşturarak yapar Fabrika desen bakmak düşünüyorum.

Bana aşağıda bunu değiştirilmiş bir sürümünü sunmak edelim:

class Database
{
    protected static $instance = NULL;

    public static function factory($type = '')
    {
        $type = strtolower($type);

        if (self::$instance == NULL)
        {
            $className = 'Database_'.ucfirst($type);

            // Include the class and do some checks here

            self::$instance = new $className;
        }

        return self::$instance;
    }

Bu kod parçası ile bunu oluşturmak yerde sizin veritabanı oluşturabilirsiniz:

$db = Database::factory('mysql');

Bundan sonra, bu küresel gibi bir veritabanı nesnesi erişebilirsiniz:

$db = Database::factory();

Sizin alt sınıfları Database_Mysql veya Database_Postgresql gibi adlı sınıflarında muhafaza edilmesi gerekir.

Tam olarak bu olduğu gibi Zend_Db_Profiler bakabilirsiniz. Orada kendi kodu için bazı fikirler alabilirsiniz.

Ben kendimi bu yapmak olsaydı, ben muhtemelen Decorator Benim için sorgu istatistikleri toplar veritabanı sınıfı için, her zaman bir sorgu çalıştırdığınızda bir Profiler yazmak istiyorum.

Başka bir seçenek DB sınıf ve Profiler sınıf DB sınıf Profiler bir sorgu çalıştırmak her zaman bildirir Subject / Observer deseni kullanmak sahip olacaktır.

Yoksa sadece DB sınıfa Profiler örneği enjekte ve profiler DB sınıf koleksiyon temsilci olabilir.

Bu istatistik toplama sınıfın endişe değil gibi Ancak, not, statik özelliklere sahip DB sınıf içindeki gibi koleksiyon çözecek.

Buna ek olarak, size ihtiyaç duyulduğunda için veritabanına gerçek bağlantı aramaları erteleme öneririz. Eğer ilk kez DB sınıfını örneğini zaman bağlamak istemiyorum, ama bir bağlantı yöntem içine kodu koymak. Sonra) Birisi sorgu yöntemini çağırdığında connect adlı olup olmadığını kontrol edin ve değilse, (bağlamak çalıştırın. Hiçbir şey sorgulanan alırsa, bağlantı yapmak için hiçbir gerek yoktur.