【问题标题】:Is $this a reference in PHP?$this 是 PHP 中的引用吗?
【发布时间】:2016-06-04 02:29:27
【问题描述】:

所以,我只是对一些实用的理论知识感到好奇。这个问题也是对this SO question.的直接跟进

对于PHP中的伪变量“$this”,手册中有这样的说法:

$this 是对调用对象(通常是要调用的对象)的 reference 该方法属于哪个,但可能是另一个对象

[粗体字表示强调]。

所以我的问题基本上是多方的:

  1. $this 实际上是作为引用实现的吗((不是 PHP 引用, 而是真正的指针式引用——如 C++ 中的“真正的引用”)在 PHP 中?
  2. 这里的参考手册是什么意思?是不是说当我使用伪变量 $this(例如在下面的代码示例中)时,我将一个“对象”类型的变量传递给 myFunction?或者,我是否将 PHP 引用或“真实引用”传递给 myFunction?

    class FooFighter{
        __construct(){
            $this->myFunction($this);
        }
    
    function myFunction($foo){
        gettype($foo);
        }
    }
    
  3. 我尝试使用以下代码找到#2 的答案,但出现错误:

        class FooFighter{
        __construct(){
            echo '$this type: ' . gettype($this);
            }
        }
    

可捕获的致命错误:AppInstance 类的对象不能 转换为字符串 文件在第 44 行

这告诉我应该传递给 myFunction 的变量实际上是一个对象,但如果我将“真实引用”作为“真实引用”(C++ 风格)传递给 myFunction,我希望得到相同的行为Reference) 可以用来代替实际的对象。

那么,PHP 中的 $this 是 C++ 样式引用(“真实引用”)还是实际对象?我只是对文档有点困惑。

【问题讨论】:

  • 我怀疑你的致命错误是因为你没有在echo "$this type: ... 中转义$,所以解释器试图将对象转换为字符串以进行输出。至于是否是内存指针(a la C),没有:php.net/manual/en/language.references.whatare.php
  • 也许你可以试试 get_class($this);这将有助于回答您的问题
  • 改用echo '$this type' . gettype(..),或echo "\$this etc...。将$this 放入" 引用的字符串会强制php 尝试对该对象进行字符串化,并且它没有__toString() 魔术方法。
  • @CD001 哇,完全错过了,谢谢。 -马丁。谢谢。所以,它肯定告诉我 $this 是类 FooFighter 的对象。但不幸的是,它并没有完全回答我问题的核心,因为我相当确定“真实引用”会返回相同的值,因为“真实引用”会指向内存地址。 (感谢您的信息)
  • 参见docs.php.net/manual/en/language.oop5.references.php,“引用”的意思是“允许对象访问者找到实际对象的对象标识符”。

标签: php reference this pseudo-element


【解决方案1】:

注意以下几点:

php > $x = new StdClass();
php > $y = &$x;
php > echo gettype($x);
object
php > echo gettype($y);
object
php > class foo { function __construct() { echo gettype($this); } }
php > $z = new foo();
object
php > $a = 42;
php > $b = &$a;
php > echo gettype($b);
integer

请注意,PHP 在任何情况下都不会报告变量作为参考。它只报告引用指向的任何类型。

【讨论】:

  • 谢谢,这更接近我要问的问题。那么有没有办法知道呢?我确信一本关于 PHP 的深入书籍可能会提到该语言是如何实现的,但我还没有准备好阅读。我现在掌握的信息足以让我继续工作。所以 $this 是一个参考,就像手册说的那样,但我不禁好奇它是如何实现的。有什么地方可以看到 PHP 语言的实现吗? Google 结果对我来说不太好。
  • 曾经有一个 hack 挖掘了 php 的调试能力来计数:stackoverflow.com/questions/4817562/… 但是从 5.4 开始不起作用。并且不适用于任何单个通用变量-可能是参考
  • 感谢该链接,可惜它在 5.4 之后无法使用。好吧。我暂时把这个问题悬而未决,也许以前剖析过 PHP 的人会知道这个问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
相关资源
最近更新 更多