php中$ this ::和$ this->的差异

Mah*_*r13 3 php oop class this self

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

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

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
Run Code Online (Sandbox Code Playgroud)

我想知道使用$ this->和$ this :: prefixes调用方法的差异.

ps:在这个链接中有一个关于$ this-> foo()和self :: foo()差异的页面: 何时使用self超过$ this?

Col*_*n M 6

您链接的答案会告诉您确切要查找的内容;).

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

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

关于创建对象的重要注意事项是它也有自己的范围.这真是$ this vs 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();
Run Code Online (Sandbox Code Playgroud)

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

你好Mahoor13 hi Mahoor13

这应该给出设置类属性和设置实例属性之间的区别的一般概念.如果您需要其他帮助,请与我们联系.

编辑

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


Oma*_*wan 5

$这个- >从实例调用,所以你必须有对象的实例来使用这个调用。

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

myclass::doFoo();
public static function doFoo(){ .... }
Run Code Online (Sandbox Code Playgroud)

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