3

可能重复:
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?

4

2 回答 2

6

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

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

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

关于创建对象需要注意的重要一点是它也有自己的作用域。这确实是 $this 与 static::(注意:不要使用 self:: 或 $this::,请使用 static::(稍后会详细介绍))发挥作用的地方。Using$this是指示 PHP 访问当前对象的属性和方法。Usingstatic::指示 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 处理范围的方式的副作用。我不会认为它有效,也不会使用它。它似乎不受任何支持。

于 2012-11-12T14:19:00.697 回答
5

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

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

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

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

于 2012-11-12T14:14:36.937 回答