对OO课堂方法的困惑

时间:2013-12-11 19:53:29

标签: php oop session

我将以下内容放在我网站上每个页面的顶部。

require_once "classes/Session.php";

这堂课:

require_once 'Form.php';
require_once 'Database.php';

class Session{

public $referrer;
public $logged_in;
public $url;

public function __construct(){

    $this->startSession();

}

public function startSession(){

    session_start();

    $this->logged_in = $this->checkLogin();

    //set last page visited
    if(isset($_SESSION['url'])){
        $this->referrer = $_SESSION['url'];
    }
    else{
        $this->referrer = "/";
    }

    //sets the current URL
    $this->url = $_SESSION['url'] = $_SERVER['REQUEST_URI'];
}

}

我改变了处理这个问题的方法。

我曾经把新的Session放在Session.php的底部,但那不是纯粹的OOP吗?

我不明白的是在哪里创建Session对象,以便我可以在我的页面上使用它?

我对此感到有点困惑,但觉得我错过了一些基本的东西,让我思考正确的方法。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

听起来你正在尝试创建一个Singleton类(一个只实例化一次的类)。确实,这通常被认为是非OOP或bad-form,但在处理数据库处理程序等事情时很常见。这可能会有所帮助:Creating the Singleton design pattern in PHP5

编辑:如果您不想使用Singleton,那么您根本不需要使用对象。只需创建Session static的所有成员函数和变量,就可以像Session::startSession()一样调用它们。如果你这样做,你甚至不需要构造函数。

重要的是要确认何时需要使用某个对象,何时不需要。当您想拥有多个实例时,通常会使用一个对象 - 每个实例都有自己的值。对象也可以传递给其他函数。如果您不需要多个实例或能够将其作为函数参数传递,则只需使用静态类来封装逻辑。 Singleton设计模式适用于您仍希望将对象传递给方法并将其像对象一样使用的情况,但您只希望有一个实例。从技术上讲,您不需要使用Singleton来执行此操作。

再次编辑:Dependency injection在技术上是处理这些内容的最佳方式。您可以将Server对象(或包含Server对象的容器)传递给所有其他构造函数。那是“纯粹的”OOP方法。