【问题标题】:Why is this Getter and Setter behaving like this?为什么这个 Getter 和 Setter 的行为是这样的?
【发布时间】:2013-03-08 20:31:58
【问题描述】:

我最近遇到了这个代码问题,我很不清楚它为什么会产生这些结果。

Class Magic {
   public $a ="A";
   protected $b = array( "a"=>"A", "b"=>"B", "c"=>"C");
   protected $c = array(1,2,3);

   public function __get($v ) {
      echo "$v,";
      return $this->b[$v]; //internal so fine with protected.
   }

   public function __set($var, $val ) {
      echo "$var: $val,";
      $this->$var = $val;
   }
}

$m = new Magic();

//1
//echo $m->a;
//prints A

//2
//echo $m->a;
//echo $m->b;
//prints Ab, B

//3
//echo $m->a.",," . $m->b; 
//prints b,A,,B

我无法理解数字 3 的行为。如果有人能解释我将非常感激,因为我无法在任何地方找到有关此行为的任何答案。

我了解访问修饰符和属性可见性,但我不确定为什么要先打印“b”,因为允许调用受保护属性的 getter 这样做。

此外,我原以为会先打印“A”(例如 1 和 2)。
奇怪的是为什么它同时回显“a”和“b”时表现不同。

我唯一能想到的就是echo
- 使用逗号版本,每个参数都被依次评估和回显
- dot 版本不同,必须经过全面评估才能按要求回显。
但不确定(它如何评估?)。

谢谢

【问题讨论】:

  • 投反对票的人能否解释一下原因?
  • 我不知道,但我发现这个问题没有错,写得很好,有作者的例子和自我尝试,所以我会给你我的投票。
  • 感谢@Voitcus。有 2 票不知道为什么。这是一个看起来很奇怪的行为的通用问题。

标签: php oop


【解决方案1】:

这是因为__get 方法中的echo。 如果您调用echo $m->a.",," . $m->b;,则首先调用语句中的函数。 所以__get中的echo会先被调用。

【讨论】:

  • 所以主'echo'在完成评估之前不会打印任何内容(即点击它;)? getter echo 是否立即打印?
  • 是的,这里有两个操作:首先是字符串连接,然后将连接的结果传递给您的 echo 命令以输出。问题是:当连接完成时,getter 的内部已经将“b”回显到标准输出,所以当你的回显发生时,它只是附加到它上面。
  • 啊是的认为你是对的。看看这个测试codepad.org/EY3NdgDE。现在看起来很明显哈哈。干杯
【解决方案2】:

这与 PHP OOP 无关,而是与操作数的评估顺序有关:

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

是 3 个操作数的串联:

  • $m->a : 返回 "A"
  • ,,: 返回 ",," (duh)
  • $m->b 通过调用 $m->__get('b') 做了两件事:首先是 echos “b”(在 getter 函数本身中),然后是 返回“B”表示连接。

所以当 3 个操作数连接成一个字符串“A,,B”时,程序已经回显了“b”。然后将连接的字符串传递给您的命令 echo 进行输出,因此最终结果为:“b,A,,B”

【讨论】:

  • 但这不会导致B在A之前打印吗?
  • 为什么 B 在 A 之前打印?您的连接确实是 ("A" . ",," . "B"),它按预期计算为 "A,,B"。只是在内部,当“B”被解析时,你的吸气剂已经将“b”回显到标准输出。
  • 啊,是的,明白你的意思,欢呼声让我花了更长的时间才明白你的意思。
猜你喜欢
  • 2010-09-24
  • 2017-10-13
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多