PHP Nesne Tabanlı Web Uygulaması

5 Cevap php

Ben sayfasında, kullanıcı için "Kullanıcı" olarak adlandırılan bir başka sınıfın düzeni için "Düzen" adlı bir sınıf var.

Ben oluşturmak Her sayfa, yeni bir Düzen örneğini.

Bir kullanıcı oturum açtığında, örneği, yeni bir kullanıcı var.

Nasıl örneği kullanıcı hakkında bilmek düzen sınıfının bir örneği alabilirim? Ben de bir oturum değişkeni Kullanıcının tüm örneğini kurtarabilir. Ben bu olsa kötü bir fikir olduğunu varsayalım. Bunun için en iyi yöntemler nelerdir?

class User
{
  var $userid;
  var $email;
  var $username;

  function User($user)
  {
     $this->userid = $this->getUid($user);
     $this->email = $this->getEmail($user);
     $this->username = $user;
  }
  function getUid($u)
  {
     ...
  }

  function getEmail($u)
  {
     ...
  }
}

class Layout
{

    var $var1;
    var $var2;
    var $var3;

    function Layout()
    {
        //defaults...
    } 


    function function1()
    {
        echo "something";
    }


   function function2()
   {
        echo "some other stuff";
   }

   function function3()
   {
      echo "something else";
   }

}

yani index.php, örneğin, ben aşağıdaki yapardın:

include "user.php"
include "layout.php"

$homelayout = new Layout();
$homelayout->function1();
$homelayout->function2();
$homelayout->function3();

Şimdi en login.php birisi yapman diyelim:

include "layout.php"
include "user.php"

if(userAuthSuccess)
{
    $currentUser = new User($_POST['username']);
}

$ CurrentUser erişmek için en iyi yolu nedir ve bu tür vb $ CurrentUser-> e-posta olarak üye değişkenler var sürece kullanıcı dışarı açmamış gibi dışarı buradan tüm php dosyalarını,?

5 Cevap

Her istek ve böylece programın her çalıştırmak için için tek kullanıcı var olacağından, bu "Kullanıcı" Burada anlatıldığı gibi bir Singleton sınıf yapmak için bir durumda olurdu:

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

Diğer sınıflar tek olduğundan yanlış örnek erişim şansı olmadan geçerli kullanıcıya başvurmak için bir yol sağlayacaktır.

DISCLAIMER: Yes, I know that Singeltons are often used at the wrong places for the wrong purpose and some people tend to blame this problem on the pattern instead of the people who misused it for some smelly code. This however is a perfectly good use case for the Singelton pattern.

Ben ekstra bir sınıf yazmak sayede yukarıda belirtilen çözüm en iyi çare talep sınıfına bağımlılığı (bu durumda bir Object) enjekte edeceğini, Bağımlılık Enjeksiyon denilen bir kavram için gidiyor düşünüyorum. Modern geliştiricilerin çoğu bu sağlayacak gibi kendi uygulamalarında bağımlılıkları enjekte bu tekniği kullanarak uyacaktır:

Gevşek olarak bağlanmış programları - bağımlılık üçüncü sınıf tarafından enjekte edildiğinde, program mantığı içinde sabit kod bağımlılık gerek yoktur.

Maintainable kodu - Bu en çok büyüleyen OOP paradigması bu özelliğidir. Büyük ölçekli programlara atıfta bu özellikle doğrudur.

Bellek Yönetimi - Bir geliştirici olarak, size şartname gerekliliklerine belleği yönetmek için ücretsizdir.

Içine almak için çok kötü bir alışkanlıktır küreselleşen amacıyla bir oturum değişkeni veya çerez koyarak bir şey "Küreselleşen", ve bunun keyfi bir değişken sınıf dışında ayarlanan güveniyor sıkı birleştiğinde kütüphanelere yol açar. Genel Oturum değişkenleri de, diğer nedenlerle uzak kalmak için iyi.

Herhangi bir sınıf içine bir değişken almak için en iyi yolu, bir argüman olarak geçmektir. Eğer (çıkışları) bu işler sizin Düzen sınıfında bir yöntem var mı? Siz düzen içinde kullanılabilir bir veri ilişkisel dizi alır yöntemine bir argüman $ veri eklemek isteyebilirsiniz.

I'd personally use a registry class (Singleton) and register the user there for the Layout to access. That way, you only need to pass an instance of the registry to the Layout. The User class is not integral to the Layout's construction - since it should only be concerned with the Layout, so I wouldn't pass that in the constructor.

Başka bir yöntem Görüntüleme ve Modelleri arasında bu etkileşimleri düzenlemek için bir denetleyici kullanmak olacaktır. Yeni Denetleyici oluşturulur zaman, bu çıkışı bulunuyor tampon. Sonra, en içeriği unbuffer, render süresini ve özelliklerine (veya bir özellik dizi) sonra onları işleyebilir görüş, bunları atamak. Muhtemelen gerçek bir model sınıfı Görünüm / Düzen geçirilecek gerekmez - sadece çıkış bulunuyor.

Bir kayıt deseni kullanın. Bir tekiz yapmaya gerek yok, herkes etrafında o kelimeyi atıyor.

include "layout.php"
include "user.php"

if(userAuthSuccess)
{
    $data['currentUser'] = new User($_POST['username']);
}

$data['nav'] = new nav('home'); 

$homelayout = new Layout( $data );

Şimdi $homelayout $data (ki bunu içine koymak tüm değişkenleri içeren) veri dizisi aracılığıyla erişebilirsiniz.