php中返回和回显的行为

时间:2015-09-17 14:18:27

标签: php

我对该计划的运作方式感到困惑;代码应打印A, bB,但显示bA,B

class SampleClass {
    public $a = "A";
    protected $b = array ("a" => "A", "b" => "B", "c" => "C");

    public function __get($v){
        echo "$v";
        return $this->b[$v];
    }
}

$m = new SampleClass();

echo $m->a . ", " . $m->b;

2 个答案:

答案 0 :(得分:9)

这真的很有道理。让我们考虑一下执行顺序:

在PHP可以回复您请求的字符串之前,它必须首先评估它(即$m->a . ", " . $m->b部分)

所以在这一点上,解析器尝试解析$ m-> a和$ m-> b,它解析了第一个,但是第二个失败了,所以我们转到魔术方法。

神奇的方法回应某些东西(第一个'b),然后将自己解析为B.

现在,我们需要完成我们开始的工作(原始回声)。

那我们有什么?

  1. 解析$ m-> b(过程中b中的回声)。
  2. echo" A,B"
  3. 将它们组合在一起?

    BA,B

答案 1 :(得分:1)

这很奇怪,但它并没有做你认为它正在做的事情。

运行此代码会有所不同。

class SampleClass {
    public $aaa = "A";
    protected $b = array ("a"=> "A", "b" => "B", "c" => "C");

    public function __get($v){
        echo "$v";
        return $this->b[$v];
    }
}


$m = new SampleClass();

echo "[" . $m->a. ", ". $m->b. ", ". $m->c . "]";

输出是:

abc[A, B, C]

当您执行$ m-> a时,您的原始__get不会被调用,因为有一个变量' a'无论如何。它只是作为最后的手段,所以你应该写自己特定的“吸气剂”。而不是功能。