我正在运行以下代码:
class Foo {
private $var = 0;
function isVarSet () {
return ($this->var != 0);
}
}
...
foo = new Foo();
导致“未定义属性”通知: foo::$var 在我的 PHP(版本 5.3.5)上。
如果我只重写函数 isVarSet():
function isVarSet() {
if (isset($this->var))
return ($this->var != 0);
return false;
}
通知消失。
这个我不明白。$var 在这两种情况下都设置了,为什么它会是一个未定义的属性?为什么我需要使用 isset() 来防止这个通知?另外,为什么通知使用范围运算符 :: 引用 $var ?我没有使用静态类,我使用的是实例 foo。$foo->isVarSet() 应该访问一个既定义又非静态的 $var。
我已经为此工作了几个小时,并阅读了关于未定义属性通知的所有其他答案,但我只是没有得到这个答案。请各位StackOverFlow高手赐教。
我的应用程序中的代码:
<?php
class session {
private $userId = 0;
function __construct() {
session_start();
$this->setUserId();
}
public function isLoggedIn() {
//if (isset($this->userId))
return ($this->userId != 0);
//return false;
}
function getUserId() {
if (isset($this->userId))
return $this->userId;
else
return false;
}
private function setUserId() {
if (isset($_SESSION['userId'])) {
$this->userId = $_SESSION['userId'];
} else
unset($this->userId);
}
public function login($user) {
if ($user != null) {
$_SESSION['userId'] = $user->id;
$this->userId = $user->id;
}
}
public function logout() {
unset($_SESSION['userId']);
unset($this->userId);
}
}
$session = new Session();
?>
对会话类的调用是这样的:
if ($session->isLoggedIn())
redirectToLocation("../public/index.php");