我的网页上有一个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
对象?
答案 0 :(得分: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 );
基本上,避免从对象方法内部启动类。这导致不可维护和不可测试的代码。特别是当你需要使用模拟服务“模拟”实例时。我建议你重新考虑一下这个设计,你所拥有的设计只会随着时间的推移变得更加嗅觉。
答案 1 :(得分: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
}
}
答案 2 :(得分: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();
?>
应该为你做的伎俩。
答案 3 :(得分:0)
您可以将对象存储在会话中,然后在任何地方访问它。