PHP新手问题;“注意:未定义的属性”

3
我正在运行以下代码:
class Foo {  
    private $var = 0;

    function isVarSet () {
           return ($this->var != 0);
    }
}

...

foo = new Foo();

在我的PHP(版本5.3.5)中,使用foo::$var会导致“未定义属性”的通知。

如果我只重写函数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");

我在Windows服务器上尝试了您的代码,使用相同的PHP版本(5.3.5),但它没有抛出任何异常(!?)。 - Wh1T3h4Ck5
请给我们完整的代码,你已经添加了...所以还有更多吗? - Nick Weaver
只是为了好玩,试着将属性声明为public或static并再次测试。没有复现的问题。 - mario
4
它没有抛出通知,可能是在简化代码示例时解决了问题。 - Wrikken
3个回答

2

(在整个编辑之后)。

你认为这行代码(在setUserId函数中)是干什么用的:

 unset($this->userId);

你可能只想将它设置为0,就像之前一样(你认识到这表示未登录)。
 $this->userId = 0;

或者:

 $this->userId = null;

随便选。


哇,我简直不敢相信我竟然忽略了那个。非常感谢您的时间和答案。我应该从stackoverflow上删除这个问题吗?那可能吗?再次感谢。 - Mansiemans
这个想法是不去修改问题,这样其他人就可以找到它,并可能从答案中受益(尽管这里的答案有点局部化,但理论仍然适用)。 - Wrikken
或者你可以决定不使用unset,而是将其简单地设置为0或null。 - Vish
@user658911:那正是我所说的,但请注意它们远非同一回事。一个null变量并不等同于一个不存在的变量。 - Wrikken

0

php 5.3.5/Windows

<?php

  function eh($errno, $errstr) {
    echo "[$errno] $errstr";
    }

  set_error_handler('eh');

  class Foo {  
    private $var = 0;

    function isVarSet () {
      return ($this->var != 0);
      }

    public function testVar() {
      return var_export($this->isVarSet());
      }
    }

  $foo = new Foo();
  echo $foo->testVar();

?>

输出结果为:

false

对于 $var=1,输出结果为:

true

所以在这里它完美地运行。


-2

我认为这是因为你在第一个例子中没有初始化你的变量。你需要先在一个被调用的方法中进行变量的初始化操作,然后它才会被初始化。 希望对你有所帮助。


3
那么它不是通过 "private $foo = 0" 进行初始化的吗?这真的让人感到困惑。 - Mansiemans
2
它是由那个初始化的,这个答案不是你要找的答案。 - Wrikken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接