1

page我的网页有一堂课。当它被调用时,它会创建一个新的user. 这使我可以检查是否有用户登录。这是page该类的构造方法:

public function __construct() {
    // check user is logged in
    require 'classes/user.class.php';
    $user = new user();
    if(!$user->isLoggedIn()) {
        // user is not logged in
        // load login page
    }
    else {
        // user is logged in
        // load requested page
    }
}

整个用户验证工作正常,但我现在想访问user在构造过程中创建的对象page。这是否与我处理事情的方式有关,如果是这样,我如何访问该user对象?

4

4 回答 4

4

老实说,这是一个非常没有实际意义的设计。更好的是在页面上下文之外创建用户对象,然后在需要的地方“注入”它:

# page.php
class Page {
    # private $_user; # maybe ... probably not needed.
    public function __construct( User $user ) {
        if ( $user->isLoggedIn() ) { /* etc */ }
        # if this will be needed in other functions, save a copy of the
        # obj reference to as an object attribute:
        $this->_user = $user;
    }
}

# user.php
class User {
    public function isLoggedIn() { /* etc */ }
}

# request_controller.php
$user = new User();
$page = new Page( $user );

基本上,避免从对象方法内部启动类。这导致不可维护和不可测试的代码。特别是当您需要使用模拟服务“模拟”实例时。我建议您重新考虑设计,您拥有的设计只会随着时间的推移而变得更臭。

于 2012-06-14T13:15:55.063 回答
1

我可以把user它作为一个实例变量,然后用关键字访问它$this->

例子:

class Page {
    public $user; // private if you want to access it only within Page

    public function __contruct() {
        $this->user = new user();
        // rest of your code
    }
}
于 2012-06-14T13:03:48.953 回答
1
<?php
require_once 'classes/user.class.php';
class page {
    private $myUser;

    public function __construct() {
        // check user is logged in

        $this->myUser = new user();
        if(!$this->myUser->isLoggedIn()) {
            // user is not logged in
            // load login page
        }
        else {
            // user is logged in
            // load requested page
        }       
    }

    public function getUser() {
        return $this->myUser;
    }
}

$p = new page();

$user = $p->getUser();
?>

应该为您解决问题。

于 2012-06-14T13:07:31.760 回答
0

您可以将对象存储在会话中,然后在任何地方访问它。

于 2012-06-14T13:05:34.087 回答