使用自我时,父母,静态和如何?

2022-08-30 21:53:06

如果到现在为止,我有点理解了,现在我意识到我什么都不懂。我太困惑了,我很难理解,我不能。有人可以解释这个程序,当使用自我,父母,静态,以及我所做的所有最小的改变如何改变结果,而我无法理解发生了什么。多谢。。

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

答案 1

您需要了解晚期静态绑定的概念,它确定标识符何时绑定到代码/数据。你可以告诉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();

答案 2

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

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

...

由于静态方法无需创建对象的实例即可调用,因此伪变量$this在声明为静态的方法中不可用。

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

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

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


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

请看一下 A 类中的方法。它调用 .这意味着该方法将在调用函数的类的作用域中调用,而不是在定义函数的类的作用域中调用。所以如果你要调用 ,它会回声 C。foo()static::who()who()C::foo()

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

希望这有帮助。


推荐