"B", "c" => "C"]; protected $c = [1, 2, 3]; pu-6ren">
gpt4 book ai didi

php - PHP 中奇怪的魔法 __get() 行为

转载 作者:行者123 更新时间:2023-12-02 07:00:41 24 4
gpt4 key购买 nike

我正在研究神奇的 PHP 方法并想出了非常奇怪的行为。我的代码:

<?php
class Magic
{
public $a = "A";
protected $b = ["a" => "A", "b" => "B", "c" => "C"];
protected $c = [1, 2, 3];

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

$m = new Magic();

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

echo PHP_EOL;

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

输出:

A,b,B,c,C
b,c,A,B,C

我希望得到这样的东西:

A,b,B,,c,,C
A,b,B,,c,,C

为什么输出线不同?

最佳答案

我已经像这样编辑了魔术方法,将内部添加到输出中。

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

我得到了

A, internal b,B, internal c,C
internal b, internal c,A,B,C

因此,当我们调用 $m->a 时,它会返回 a 属性,因为它是 publicly 定义的。

$b 和 $c 受到保护,这意味着我们的魔术方法将起作用。

echo $m->a.","; 表示 A,,而不调用神奇的 __get 方法。因为 a 是公共(public)属性(property)。

虽然 echo $m->b.",";internal b, B, 因为它调用了我们的魔术方法。

我们一一给出变量,但在第二次调用中,我们同时需要所有三个变量。

在这种情况下,当我们将所有三个变量同时提供给 echo 命令时;它首先尝试获取所有三个,然后将它们打印在屏幕上。 (参见 Joncomment 。)

当 echo 命令收集信息时,它会为 b 和 c 调用我们神奇的 __get 方法两次,我们的方法 会在屏幕上打印一些东西。 (internal b, internal c,) 然后,在我们的魔术方法返回并且 echo 命令收集到它需要的信息后,它打印它得到的信息,即 A,B,C

关于php - PHP 中奇怪的魔法 __get() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com