PHP新手问题; “通知:未定义的属性”

PHP新手问题;  “通知:未定义的属性”

问题描述:

I'm running the following code:

class Foo {  
    private $var = 0;

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

...

foo = new Foo();

results in an "undefined property" notice: foo::$var on my PHP (ver. 5.3.5).

if I rewrite just the function isVarSet():

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

the notice disappears.

This I do not understand. $var is set in both cases, why would it be an undefined property? Why do I need to use isset() to prevent this notice? Also, why does the notice refer to $var with the scope operator :: ? I'm not using a static class, I'm using an instance foo. $foo->isVarSet() should access a $var that is both defined and non-static.

I've been working on this for hours now and read all other answers on the undefined property notice, but this one I just don't get. Please enlighten me, * masters.


the code in my application:

<?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();

?>

The call to the session class is made like so:

if ($session->isLoggedIn())
redirectToLocation("../public/index.php");

(after the whole edit).

What do you think this line does (in setUserId):

 unset($this->userId);

You might just want to set it to 0 as previous (which you recognize as not logged in:

 $this->userId = 0;

Or:

 $this->userId = null;

Take your pick.

I think it is because you didn't initialize your variable in your first example. You need to first initialize the var in a method which is called. Only then it is initialized. Hope this helps you.

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();

?>

output is:

false

for $var=1, output is:

true

So it works perfectly here.