【问题标题】:Checking for class instance within another class检查另一个类中的类实例
【发布时间】:2011-07-01 17:35:07
【问题描述】:

我创建了一个包含用户信息的用户类。另外,我用另一个名为 LoggedInUser 的类扩展了该类。

LoggedInUser 的重点是能够通过简单地检查 LoggedInUser 对象的存在来轻松判断用户是否已通过身份验证和登录,如下所示:

class User {
 //properties
}

class LoggedInUser extends User {
 //some additional token stuff
}

$isLoggedIn = new LoggedInUser();

class Router {
 public function gotoRoute() {
  if($isLoggedIn) {
   // perform the action
  }
 }
}

据我所知,该类无法访问 $isLoggedIn,所以我应该将它传递给构造函数吗?还是有更好的方法来完成这一切?

【问题讨论】:

  • 顺便说一句,您将一个对象分配给 $isLoggedIn,所以它不会总是评估为 TRUE 吗?

标签: php class token


【解决方案1】:

在我看来,您有两种选择。您可以将LoggedInUser 传递给Router::__construct()。或者您可以在Router::__construct() 中创建LoggedInUser

第一个选项:

$LoggedInUser = new LoggedInUser();
$Router = new Router($LoggedInUser);

第二个选项

$Router = new Router();

// in router class file
__construct() {
    $this->YourProperty = new LoggedInUser();
}

我喜欢第一个选项。它被称为Dependency Injection

【讨论】:

  • 谢谢 charles,我也倾向于选项 1。我在会话中简单地存储 authID 并检查的第三个选项怎么样?这是不好的做法吗?
  • 我不一定会称之为不好的做法。只需使用一个类,您就可以用它做其他事情,例如轻松地将其绑定到数据库,在类中包含某种状态检查方法以封装所有会话方法。如果你最终需要做这些类型的事情,你可以很容易地得到“意大利面条代码”。我喜欢尽可能地封装。
【解决方案2】:

我不完全确定这是否是您所追求的,但是如何将 $isLoggedIn 设为私有变量以便类可以检查它的存在?

私有 $isLoggedIn = new LoggedInUser();

【讨论】:

  • 我认为你正在做某事......我会尽快回复你
【解决方案3】:

首先,变量始终是类的语言环境。您不能在类之外分配变量然后调用它。

在这样一个简单的脚本中,我会这样做:

class Router {
    public function gotoRoute() {
        $isLoggedIn = $isLoggedIn = new LoggedInUser();
        if( $isLoggedIn instanceof User ) {
        // perform the action
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多