为什么这段PHP代码打印无序?


Why does this PHP code print out-of-order?

我正在学习PHP OOP,我正在自己尝试一些例子。这个例子运行了,但是它的输出是出乎意料的:

Class.php :

class Member
{
  public $username = "Default";
  private $prop1 = "I'm a class property!";
  private $loggedIn = false; 
  public function login() {
    $this->loggedIn = true;
  }
  public function logout() {
    $this->loggedIn = false;
  }
  public function isLoggedIn() {
    return $this->loggedIn;
  }
  public function isLoggedIn2() {
    if ($this->loggedIn == 1){
    echo "connected";   
    } else {echo "not connected";}
  }
}
?>

index . php :

$member = new Member;
$member -> username = "FRED";
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out " ) . ($member->isLoggedIn2()) . " test " . "<br>";

期望输出:

FRED已注销test 未连接

实际输出:

未连接FRED已注销test

为什么index.php写isLoggedIn2()的结果在开始而不是在结束?

  public function isLoggedIn2() {
    if ($this->loggedIn == 1){
    echo "connected";   
    } else {echo "not connected";}
  }

您将其echo出来,因此无论何时调用该函数都将打印出来。相反,您应该像使用其他方法一样使用return

  public function isLoggedIn2() {
    if ($this->loggedIn)
        return "connected"; 
    else
        return "not connected";
  }

为什么要这样印刷?这里有一个相当复杂的语句:

echo $member->username . " is " . 
  ( $member->isLoggedIn() ? "logged in" : "logged out " ) .
  $member->isLoggedIn2() . " test " . "<br>";

为了实际打印这个,PHP首先需要知道到底要打印什么。$member->username和字符串(test等)都是已知的,所以不用担心。

但是每个方法都需要被调用,以知道它的返回值。如果您使用常规的return,则无需担心,因为您可以将其放置在需要的位置。但是由于您在方法内部将其echo输出,因此无论何时调用该方法,它都会被打印出来。

所以这里发生的是PHP调用每个方法和之后试图打印它的。这就是为什么"Not connected"在其他所有内容之前被打印出来。

在表达式中使用的函数应该使用return,而不是echo。问题是,当计算echo的参数列表时,isLoggedIn2函数正在回显其消息。改为:

public function isLoggedIn2() {
    if ($this->loggedIn) {
        return "connected";
    } else {
        return "not connected";
    }
}

这与OOP无关。您需要对普通函数执行相同的操作。

  public function isLoggedIn2() {
    if ($this->loggedIn == 1){
    return true;   
    } else {return false;}
  } 
$member = new Member;
$member->username = "FRED";
$member->login(); // make login
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out " ) . ($member->isLoggedIn2()) . " test " . "<br>";
$member->logout(); // make logout
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out " ) . ($member->isLoggedIn2()) . " test " . "<br>";

尝试使用

public function isLoggedIn2() { 
  if ($this->loggedIn == true ) { 
    echo "connected"; 
  } 
  else {
    echo "not connected";
  } 
}