关于oop:php中$this::和$this->的差异

Diffrences of $this:: and $this-> in php

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
PHP: self vs. $this

我发现可以通过$this::prefix调用类方法。例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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()的差异:什么时候用自己超过$这个?


您链接的答案确切地告诉您正在寻找什么;)。

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

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

关于创建一个对象,需要注意的重要一点是它也有自己的范围。这就是$this与static::(注意:不要使用self::或$this::,请使用static::(稍后将详细介绍))来播放的地方。使用$this指示PHP访问当前对象的属性和方法。使用static::指示PHP访问您的对象所用的基类的属性和方法。

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();

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

你好,马霍罗13你好!

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

编辑

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


$this->是从实例调用的,因此必须有对象的实例才能使用此调用。

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

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

do函数应该是静态函数来这样调用它,否则PHP会在新版本中出错。