PHP Class Kapsam konular

2 Cevap php

Aşağıda yaşıyorum sorun bir çok temel bir örnektir.

Şimdi neden $session = new Session(); benim sistem dosyaları zaten görünür olacağını bir şekilde dahil database.class.php dosyası kullanmanız gerekir.

Diğer bir deyişle I $ session = new Seansı arayamam (); herhangi diğer sınıfların dışında, ben onu kullanmak istediğiniz her sınıfta oturum sınıfının, nasıl bunu önlemek ve bu yapmadan çalışması yapabilirsiniz objectof yeni oluşturmak aramak için ben başka sınıflara çalışması için?

// Session.class.php
class Session{

    public function __construct()
    {
    	session_start();
    }

    public function set($name, $value)
    {
    	$_SESSION[$name] = $value;
    }
}

...

// Database.class.php
class Database{

    public static function mysql_query_2($query)
    {
    	if ($session->get('user_role') == 10){
    		$_SESSION['queries']++;
    	}
    	return mysql_query($query);
    }
}

2 Cevap

Sorunu doğru anlamak, sorunun tek çözümü bir Singleton kullanmaktır.

final class Singleton {

    protected static $_instance;

    // Singleton can't be constructed or cloned
    protected function __construct(){ }	 
    protected function __clone() { }

    // Create an instance if necessary and return an instance.
    public static function getInstance(){
      if( self::$_instance === NULL ) {
        session_start();
        self::$_instance = new self();
      }
      return self::$_instance;
    }

    public function set($name, $value){
        $_SESSION[$name] = $value;
    }
}

index.php sen olurdu In:

$session = Session::getInstance();
$session->get();

Sonra Veritabanı sınıfında sahip olacaktır:

// Database.class.php
class Database{

    public static function mysql_query_2($query)
    {
        if (Session::getInstance()->get('user_role') == 10){
                $_SESSION['queries']++;
        }
        return mysql_query($query);
    }
}

Sen sadece hiç (Ben sizin aradığınız düşünüyorum ne olduğunu) Oturum sınıfının bir örneğini oluşturmak istiyorum. Eğer başka bir yerde Session sınıfı (yani veritabanı sınıfı) gerek o zaman sadece Session::getInstance() tekrar arayın. Orada şimdiye kadar oluşturulmuş Oturum yalnızca bir örneği olduğunu ve size komut global olarak kullanabilirsiniz.

Birincisi ve en önemlisi, Oturum sınıf bir singleton olmalı - sebebi çok sayıda aramalar () size hiçbir şey ama problem alacak session_start olmasıdır (session id rejenere olur)

Yani ...

/**
 * Session singleton class
 */
class Session
{
    // prevents object instanciation ($obj = new Session())
    protected function __construct() {
        session_start();
    }

    // prevents object cloning
    protected function __clone() {}

    public static function getInstance()
    {
    	static $instance = null;
    	if ($instance == null)
    		$instance = new Session();
    	return $instance;
    }

    // rest of the code
}

Bunu kullanmak için sadece çağırır:

$sess = Session::getInstance();
$sess->doSomething();

ya da sadece

Session::getInstance()->doSomething();

Her yerde oturum sınıfını kullanmanız gerekir.

Update: - I see you probably don't grasp the concept of singletons yet, so here's a proper wikipedia link 8)