【问题标题】:PHP: How can $this variable inside one class be object of another one?PHP:一个类中的 $this 变量如何成为另一个类的对象?
【发布时间】:2011-06-13 05:18:15
【问题描述】:

这是一个例子:

class Test {

    public function TestMethod() {

        print_r($this); // Gives me "Test1 Object ( )"

    }
}

class Test1 {

    public function Test1Method() {

        Test::TestMethod();

    }
}

$test1 = new Test1;
$test1->Test1Method();

我觉得这很奇怪。谁能解释一下为什么会这样?

【问题讨论】:

标签: php oop this static-methods


【解决方案1】:

简短回答:您正在使用静态函数调用来调用“非静态”方法,然后 php 尝试找到一个“$this”,最后一个真正的“$this”是 Test1 中的那个。

如果您打开 E_STRICT 错误报告,它会报错。

【讨论】:

    【解决方案2】:

    来自http://www.php.net/manual/en/language.oop5.basic.php

    伪变量$this 可用 当从内部调用方法时 对象上下文。 $this 是一个参考 到调用对象(通常是 方法所属的对象, 但可能是另一个对象,如果 方法是从静态调用的 次要对象的上下文)。

    不过,这并不一定很有意义,如果启用了E_STRICT,则会引发警告。

    【讨论】:

    • 如果Test1Test 的子类就有意义了;也许这只是一种重新创建从一开始就为 OOP 设计的语言中发现的 this 行为的廉价方式。
    • 检查$this 是否引用当前类的最佳方法是什么?我需要它来检查方法是静态调用还是从对象调用。我想这类似于if ( $this instanceof __CLASS__ ) {}。我说的对吗?
    • @SaltLake:我不知道。但就个人而言,我会启用E_STRICT 来防止这种黑客行为!从长远来看,它只会导致痛苦。
    【解决方案3】:

    如果我没记错的话是late static binding,可能是周五晚些时候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多