18

如果到现在我在 ststic 中理解了一点现在我意识到我什么都不懂。我很困惑,我很难理解,我不能。有人可以在使用 self、parent、static 时解释这个程序,以及我所做的所有最小的改变如何改变结果,而我无法理解发生了什么。多谢 ..

来自http://docs.php.net/language.oop5.late-static-bindings的代码

<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
?>

输出是:

A
C
C
4

4 回答 4

25

您需要了解后期静态绑定的概念,它确定标识符何时绑定到代码/数据。您可以告诉 PHP 提前(self::)或稍后(static::)绑定它。

将示例精简为两个类,我们得到:

class A {
    public static function foo() {
        self::who(); // PHP binds this to A::who() right away
        static::who();  // PHP waits to resolve this (hence, late)!
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
       self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

B::test();
于 2012-05-08T18:53:31.720 回答
9

查看http://php.net/manual/en/language.oop5.static.php。它说:

将类属性或方法声明为静态使它们无需实例化即可访问。

...

因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量 $this 在声明为静态的方法中不可用。

不能使用$this,因为在调用静态方法时,$this变量中没有实例化的类对象。所以你使用self::.

parent::是指当前类正在扩展的父类。例如,C 类的父类是 B 类,B 类的父类是 A 类。参见http://php.net/manual/en/keyword.parent.php

当您希望函数可以访问而无需实际声明该类的实例时,您可以使用静态方法。


仔细检查您的问题后,您的链接指向后期静态绑定。该页面中的前两个示例非常清楚地表明了对static::语法的需求,但为了澄清您发布的示例:

看一下foo()A 类中的方法。它调用static::who(). 这意味着该方法who()将在调用该函数的类的范围内被调用,而不是在定义该函数的类的范围内。因此,如果您要调用C::foo(),它将回显 C。

相反,如果它调用self::who(),它将调用A::who()。因为在A类中,self::指的是A。

希望这会有所帮助。

于 2012-05-08T18:25:35.430 回答
6

答案的关键是static::who(),记住 static:: 意味着您使用实际类(在我们的例子中 - C)调用方法。

所以 C::test() 运行如下:

A::foo();   -> calls to A::foo() therefor echo A
parent::foo(); -> calls to C parent (which is B), B::foo() inherits A::foo() which calls to static::who(), but our actual class is C, therefor echo C
self::foo(); -> again calls to foo() which calls to static::who() with our actual class C

如果不是 static::who() foo 调用 self::who() 你会得到三个 A 结果。

于 2012-05-08T18:53:35.123 回答
0

当一个继承类调用继承类的方法时,哪些方法使用这些关键字;会发生什么!!用这个流程图解释。我认为这会有所帮助。 在此处输入图像描述

于 2022-01-19T20:04:30.270 回答