Bir oturum saklama sınıfı tasarımı Geribildirim

5 Cevap php

I have a session class that basicly just sets and retrieves session variables, the reason I made it was so I could easily change it to use sessions or something like memcache to set the items and have them accessible on multiple pages without hitting the database

I then have this user class which uses the session object to get session variables in it.
I am wanting to add to this user class though, to make it more encapsulated I would like to be able to set the variables that I am retrieving in this class so right now I can display the userid with $user->userid; I would like to first have a method or something that sets its value from the session object I guess Does this sound lke a good idea or possibly a lot of overhead?

Ve ne yapmaya çalışıyorum iyi bir fikir olup olmadığını belki ben bunu yapmalıyım nasıl / gösteri örneği önerebilirsiniz? Ben bu bu yöntemi eklerseniz belki ben o kendi yöntemiyle içine __ construct yönteminde kodu taşımak gerektiğini düşünüyorum

Temelde, ben sınıfta birden fazla yöntem varsa yapı yönteminde kullanılan sınıfın üst kısmında listelenen değişkenler, ama ben böyle üst hepsini ayarlamanız gerekir var?

<?PHP
//user.class.php file
class User
{
    public $userid;
    public $name;
    public $pic_url;
    public $gender;
    public $user_role;
    public $location_lat;
    public $location_long;
    public $newuser;

    function __construct()
    {
    	global $session;
    	if($session->get('auto_id') != ''){
    		//set user vars on every page load
    		$this->userid = $session->get('auto_id'); //user id number
    		$this->name = $session->get('disp_name');
    		$this->pic_url = $session->get('pic_url');
    		$this->gender = $session->get('gender');
    		$this->user_role = $session->get('user_role');
    		$this->location_lat = $session->get('lat');
    		$this->location_long = $session->get('long');
    		$this->newuser = $session->get('newregister');
    	}else{
    		return false;
    	}
    }
}

//with the class above I can easily show some user variables I have saved into a session like this below
$user = new user();
$user->userid;

?>

5 Cevap

In general your idea is a good one 3 things I would do differently:

1) uygulamasında birden fazla kullanıcıya sahip dikkate görünmüyor. aynı sınıftan yani Çeşitli örneklerini.

2) I would use factories instead of using IF in the constructor. So for a user you have saved in the session you would call:

 $savedUser = User::fromSession($userId);

Yeni bir kullanıcı için

  $user = new User()

3) oturuma bu verileri kaydetmek için serialize ve unserialze işlevlerini kullanın

Sonra sınıf olarak uygulamıştır olabilir olabilir

public static function fromSession($userId) {
   return unserialize($session->get('users_'.$userId));
}

public function save() {
   return $session->set('users_'.$this->id , serialize($this));
}

Bu belli belirsiz "bu iyi bir fikir" sorusuna bir cevap sanırım. Benim anlayış, veritabanından onları ferahlatıcı karşı oturumda değişkenleri yerini karmaşık sorgular ve kaldırırken veri arasındaki kapalı ticaretin bir sorudur. Oturum verileri sizinle uğraşmak zorunda değilsiniz bir veritabanı arama etrafında sadece uygun bir sarıcı, veritabanı aramaları kaçar ücretsiz sihirli önbelleği değildir. Eğer oturumda yer Herhangi değişken seri hale olmalıdır. Serialized verilerin bütün toplama sonra yönetilir; sunucu, oturum anahtarını kullanarak veri getirir tüm deserializes ve php komut dosyası uzattı. Bu istek-yanıt döngüsü için oturumu kapattığında sonra onu tüm serializes ve db geri koyar.

Yani bütün bu ile ilgili karışıklık, bazı durumlarda, sadece bir bağlantı açma ve doğrudan aynı şeyler için db (veya şeyler bir alt kümesi) soran karmaşa daha kötü olabilir.

Ben oturumda bir veya iki anahtar değerlerini koyarak iyi bir uğrak yeri ve Statefulness çok ağır güvenerek daha az optimal planı olduğunu söyleyebilirim.

Ben size kullanıcı sınıfında alanlar için oturum değerlere sahip olup olmadığına bağlı olarak doğru veya yanlış "ValuesInSession" gibi bir isim ile yeni bir oturum açardı. Ardından, oturumlar \ kullanıcılar sınıfında bu oturumu doğru veya yanlış olup olmadığını kontrol edebilir ve buna göre değerleri ayarlayın (varolan oturumları IE veya dizeleri boşaltmak için \ 0)

EDIT: Sen, alternatif kullanıcı veya oturumları sınıfta bu kodu koyarak, doğru değerleri ayarlamak için kullanıcıların sınıf ile işe yarayabilir yeni bir sınıf yazabilirim (belki oturumları sınıfını genişletmek olabilir?)

Ben php 5 kullanıyorsanız, size bu konuda yardımcı olmak için __ set sihirli yöntemini kullanabilirsiniz, ancak ben soruyu anlamadım emin değilim.

Mevcut sınıf değiştirme:

class User
{
     private $id;
     private $data = array();

     public function __construct()
     {
          global $session;
          $this->id = $session->get('auto_id');
          $this->data = array(
               'disp_name'=>$session->get('disp_name'),
               'pic_url'=>$session->get('pic_url'),
               'gender'=>$session->get('gender'),
               'user_role'=>$session->get('user_role'),
               'lat'=>$session->get('lat'),
               'long'=>$session->get('long'),
               'newregister'=>$session->get('newregister')
          );
     }

     // return the user id
     public function id()
     {
	     return $this->id;
     }

     // the __get magic method is called when trying to retrieve a value of a
     // property that has not been defined.
     public function __get($name)
     {
	     if(array_key_exists($name, $this->data))
	     {
		     return $this->data[$name];
	     }
	     return null;
     }


     // the __set magic method is called when trying to store a value in a property
     // that has not been defined.
     public function __set($name, $value)
     {
	     global $session;
	     // check if the key exists in the 'data' array.
	     // if so, set the value in the array as well as the session
	     if(array_key_exists($name, $this->data))
	     {
		     $this->data[$name] = $value;
		     $session->set($name, $value);
	     }
     }
}

Bu şekilde hala almak ve olduğu gibi değerleri aynı seti, aynı zamanda oturum sınıfında belirlenen değeri saklamak olacaktır olabilir.

Bu test etmek için:

$user = new User;
if($user->id())
{
     echo $user->disp_name;
     $user->disp_name = 'new name';
     echo $session->get('disp_name');
}

Ben size tavsiye etmem, çünkü:

  1. O ('Ben ne yapılmış nedeni bu yüzden kolayca değiştirebilir') "gelecek ihtiyaç halinde" bir mimari seçmek için iyi bir uygulama değildir. http://www.startuplessonslearned.com (Eric Ries) Giriş veya http://highscalability.com haberler
  2. Sizin kodu (daha fazla bilgi için Misko Hevery blogu (A google evangelist) http://misko.hevery.com bak) testi imkansız / zor.
  3. (Eğer bağımlılıkları takip etmek istiyorsanız, asla iyi bir fikir) Siz "küresel" kullanıyor.
  4. Bu "iş mantığı" (a User class) ve kablolama / bina (örneğin bir fabrika sınıfı) ayırmak daha iyidir. (http://en.wikipedia.org/wiki/Single_responsibility_principle bakın "endişeleri ayrımı")

Gerçekten iyi kod örnekleri için (ve OO yasa kırık olmamalı hangi anlamak için), sana MISKO blogu (Ayrıca youtube bulabilirsiniz google onun teknik görüşmeleri kaçırmayın) tavsiye edebilirsiniz. Ben onları seveceksiniz eminim.

Umarım bu yardımcı olur.