开发者

Sessions and PHP classes

I'm used to java, objective c and a little c++. Now i want to use PHP to create a website. I created several classes but to keep it simple: 3 classes.

Account - DataMapper - DataManager

This means that i can get an account from the da开发者_如何学JAVAtabase. In DataManager i keep track of all things. Like the userId of the user.

The thing is, normally all setted variables stay 'set', but now i'm using php i apperently need to store them by using a session. DataManager:

<? php
class DataManager
{
    // Hold an instance of the class
    private static $dm;
    private $dataMapper;
    private $dictationView;
    private $userId;

    private function __construct()
    {
        $this->dataMapper = new DataMapper();
        $this->dictationView = new DictationView();
    }

    // The singleton method
    public static function singleton()
    {
        if (!isset(self::$dm)) {
            $c = __CLASS__;
            self::$dm = new $c;
        }

        return self::$dm;
    }

    // Prevent users to clone the instance
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }


    function __get($prop) {
        return $this->$prop;
        }

    function __set($prop, $val) {
        $this->$prop = $val;
        }
}

?>

If i set the userId in the singleton DataManager class, the next time i call an instance of the DataManager class it will not rememeber the userId. Somewhere i have to deal with session i guess. How to use sessions in a good OOP way in the DataManager? Thanks!


If you want you can create a wrapper for sessions in PHP. It actually could be beneficial, especially if your application later had to migrate to a cluster of servers and sessions would be moved to a distributed cache. Then, to facilitate this migration you would only have to provide different implementation if same Session class interface.

That said.

This code there itself is not a good OOP. You should stop using singletons. And, if you class require instances of DataMapper and DictationView, then they should be created outside the class and provided in the constructor. Instead of creating a tight coupling because you constructor is making other objects.


Now, what you refer to is not PHP but rather how a client-server architecture is being handled.

Here is a change, which assumes you manage the session correctly (with regard to session_start - should be in the bootstrap of your file) I have also added some of topic corrections to your code, which will help u in the future:

    private function __construct()
    {
        $this->dataMapper = new DataMapper();
        $this->dictationView = new DictationView();
    }

    // The singleton method
    public static function singleton()
    {
        if(isset($_SESSION[self::MY_UNIQUE_IDENTIFIER] &&
           get_class($_SESSION[self::MY_UNIQUE_IDENTIFIER] == 'DataManager'){
                   self::$dm = $_SESSION[self::MY_UNIQUE_IDENTIFIER];
        }
        if (!self::$dm) {//LOOK HERE LOOK HERE!!!!!!!!!!!!!!!!!!!!
           $_SESSION[self::MY_UNIQUE_IDENTIFIER] = self::$dm = new self;
        }

        return self::$dm;
    }

    // Prevent users to clone the instance
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }


    function __get($prop) {
        return $this->$prop;
        }

    function __set($prop, $val) {
        $this->$prop = $val;
        }
}
//LOOK HERE LOOK HERE no closing ?>

Some traps I did not address here as they are not the subject of this question:

  1. The right way to manage sessions
  2. Adjustment to the class to allow inheritance without trashing the session
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜