【问题标题】:Diffrences of $this:: and $this-> in php [duplicate]php中$this::和$this->的区别[重复]
【发布时间】:2012-10-31 23:05:49
【问题描述】:

可能重复:
PHP: self vs. $this

我发现我可以通过 $this:: 前缀调用类方法。示例:

class class1 {
    public function foo()
    {
        echo "1";
    }
    public function bar()
    {
        $this::foo();
        //in this example it acts like $this->foo() and displays "2"
        //using self::foo() displays "1"
    }
}

class class2 {
    public function foo()
    {
        echo "2";
    }
    public function bar()
    {
        class1::bar();
    }
}

$obj = new class2();
$obj->bar(); // displays "2"
class1::bar(); // Fatal error

我想知道 $this-> 和 $this:: 前缀调用方法的区别。

ps: 此链接中有一个关于 $this->foo() 和 self::foo() 差异的页面: When to use self over $this?

【问题讨论】:

  • 我知道方法的静态调用和实例调用的区别。 $this:: 和 $this-> 行为相同,但 self:: 和 this:: 不同。
  • 我不认为这个问题是重复的。它特别关注$this::。显示的其他链接没有明确讨论$this::。 (对此,简单的答案是“不要使用那种语法——这似乎是 PHP 定义 $this:: 的意外或非显而易见的结果。相反,请坚持使用 $this->self::、或static::,取决于你想要表达的意思。)

标签: php oop class this self


【解决方案1】:

$this-> 是从 instance 调用的,所以你必须有一个对象的实例才能使用这个调用。

但是 $this:: 是类中的静态方法,您可以在没有实例的情况下调用它,因此您不需要分配类的实例来调用它,就像

myclass::doFoo();
public static function doFoo(){ .... }

do 函数应该是静态函数才能这样调用,否则 php 在较新的版本中会报错

【讨论】:

  • 我认为 $this:: 不是静态的,因为调用 class1::bar(); out of a class 会抛出这个错误:Fatal error: Class name must be a valid object or a string
  • 是的,我同意你的观点,$this 指针是该类的一个实例,因此他可以访问静态和非静态函数,这也适用于实例,但实例不像这样调用 $this:: doFoo();
  • 你应该通过实例调用它 $this->doFoo();或 get_class($this)::doFoo();
【解决方案2】:

你链接的答案告诉你你在寻找什么;)。

基本上,有些人在编程语言中很难区分两个概念:对象和类。

类是抽象的。它定义了一个对象的结构。如果对象是从该类构建的,则对象包含的属性和方法。创建对象是您调用new class1() 时所做的事情。这是指示 PHP 使用 class1 类的所有属性和方法创建一个新对象。

创建对象需要注意的重要一点是它也有自己的作用域。这确实是 $this 与 static::(注意:不要使用 self:: 或 $this::,请使用 static::(稍后会详细介绍))发挥作用的地方。使用$this 是在指示 PHP 访问当前对象的属性和方法。使用 static:: 指示 PHP 访问构建对象的基类的属性和方法。

这是一个例子:

class MyClass {
    public $greeting;
    public static $name;

    public greet() {
        print $this->greeting . " " . static::$name;
    }
}

$instance1 = new MyClass();
$instance1->greeting = 'hello';

$instance2 = new MyClass();
$instance2->greeting = 'hi';

MyClass::$name = 'Mahoor13';

$instance1->greet();
$instance2->greet();

我没有测试上述内容,但你应该得到:

你好 Mahoor13 嗨,Mahoor13

这应该可以大致了解设置类属性和设置实例属性之间的区别。如果您需要其他帮助,请告诉我。

编辑

$this:: 似乎只是 PHP 处理范围的方式的副作用。我不会认为它有效,也不会使用它。它似乎不受任何支持。

【讨论】:

  • 感谢您的回答,但我希望 $this:: 和 $this-> 在我的示例中它们都返回相同的值(self:: 返回 1),我不能使用 class1 ::酒吧();在这个例子中不在一个类中
  • 我明白了,看到我的编辑到最后。我不相信它是受支持的功能,我认为这只是一个副作用。
  • “基类”不是正确的术语。在 OO 中,“基”是指父类或祖先类。而是说“static::”指的是“对象是”的(直接)实例的类。或类似的措辞。与“self::”对比。它指的是“定义*code(即'self::')的类”*。 [顺便说一句,这对 PHP 来说是很糟糕的术语; “static::”正在做一些“动态”的事情(后期绑定),而“self::”正在做一些“静态”的事情(避免vtable)。它相当落后,与任何其他语言或用英语描述它的方式不一致。]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2013-08-09
  • 1970-01-01
  • 2023-02-13
  • 2010-11-06
  • 2011-04-12
相关资源
最近更新 更多