Ben bir sınıfta her yöntemi bir PHP sınıfı nesne kapmak gerekir mi?

5 Cevap php

Bazı PHP sınıfları üzerinde çalışıyorum, ben kurmak ve oturum değişkenleri değerlerini almak için kullanılan bir oturum sınıf var, ben bu yüzden daha sonra oturumu sınıfında bir tek yöntemi yapılmış ve her sınıfta bu oturum sınıf nesnesine erişimi olması gerekir Diğer sınıfın yöntemleri böyle oturum nesnesi arayabilirsiniz ....

$session = Session::getInstance();

Bu bir henüz başlatılmadı ise, yeni bir oturum nesnesi kullanın veya başka başlatmak için bana oturum nesnesi dönecektir.

Ben bir kullanıcı sınıfı ve bir veritabanı sınıf var ve her sınıf oturum nesnesi erişmek için gereken her 10 yöntemleri olsaydı Yani benim soru, o zaman ben her içeride yukarıdaki kodu çalıştırmak için gereken ve içinde her yöntem ya da sadece 1 kez olur sınıf ve sonra tüm yöntemler bu ki? Ben o kadar emin değilim, bu yeni am?? Teşekkürler

5 Cevap

Bir Singleton deseni olarak, gerçekten bunu yapmak gerekir.

Bir alternatif yapıcısındaki sınıfta bir korumalı üyesi $session olarak oturum nesnesi eklemek olabilir, ve sonra $this->session gibi her yöntemi erişiyor olabilir.

Düzenlemek ve PHP yardımcısı ve kütüphane nesneleri nasıl kullanılacağı hakkında bazı geniş tartışma okumak isterseniz, ben bir related SO question bu ilginç cevaplar vermiştir kez sordu.

Her sınıfın constructor içinde yöntemini çalıştırmak ve bir örnek değişken olarak çıkan nesneyi saklayın.

class Database {
    private $session;

    function Database() {
        $this->session = Session::getInstance();
    }
}

Sonra $ this-> oturumu ile yöntemlerinde Oturum örneğine erişebilirsiniz.

Sen kurucu içinde oturumu ayarlamak isteyeceksiniz. Olsa daha esneklik için, içinde oturum nesnesi geçmek için daha iyi olabilir:

class User {

  private $session;

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

  public function methodOne() {
    $stuff = $this->session->getStuff();
    // etc...
  }

}

// example usage
$session = Session::getInstance();
$user = new User($session);
$user->methodOne();

Bu yöntem Kullanıcı nesne belirli Oturum uygulanmasına bağlı olmadığından emin olur. Sürece daha Session nesneleri aynı arayüze sahip olarak, kullanıcı nesnesi mutlu sorunu olmadan herhangi birini kullanabilirsiniz.

// example usage
$session = SuperSession::getInstance(); // SuperSession is like Session,
                                        // but better! same interface though.
$user = new User($session);
$user->methodOne();

PHP referans nesneleri işleme, çünkü teknik olarak yapıcısındaki oturumda bir örneğini yakalayan bir taban sınıf olabilir

abstract class AbstractSessionEnabledClass {

    public function  __constructor() {
        $this->session = Session::getInstance();
    }

    private $session = null;
}

Ve sonra alt sınıflar bu sınıf yaygınlaştıracağız

class SomeClass extends AbstractSessionEnabledClass {
    public function __constructor() {
        parent::__constrcutor(); //this isn't needed if this class has no constructor
    }

    public function someMethod() {
        var_dump($this->session)
    }
}

Kapsülleme Bu tür aslında oturum yönetimi hiç değişiklik olması durumunda değiştirmek için kod kolaylaştıracaktır.

Alternatif olarak, yerine bu $session global bir değişken yapabilir.

$GLOBALS["session"] = Session::getInstance();

Daha sonra yerden $GLOBALS["session"] işleyebilirsiniz.

Eğer kod OOP idealize disiplin kadar ölçmek istiyorsanız Ancak, Pekka yanıt ile sopa :)