3

我正在运行以下代码:

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");
4

3 回答 3

2

(在整个编辑之后)。

你认为这条线做了什么(在setUserId):

 unset($this->userId);

您可能只想像以前一样将其设置为 0 (您认为未登录:

 $this->userId = 0;

或者:

 $this->userId = null;

任你选。

于 2011-04-05T22:26:50.637 回答
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

所以它在这里完美运行。

于 2011-04-05T21:00:22.953 回答
-2

我认为这是因为您没有在第一个示例中初始化变量。您需要首先在调用的方法中初始化 var。只有这样它才会被初始化。希望这对您有所帮助。

于 2011-04-05T20:46:10.307 回答