php 类方法用static::hello(); 等同于 $this->hello();吗?

今天在写代码的时候,我类在里里本想调用一个方法,默名其妙的写了一个 static, 然后再打了个:: 发现后面出现了我类的方法!突然发现还可以这样?我本是想要$this->xxx();的结果成了 static::xxx();但是我执行代码发现一样可以调用,一样没有错误出现!但在网上找static 都是说静态属性 静态方法!以前调用的时候要么都是self::xxx();要么$this->xxx();突然发现static::xxx();也可以。但没有找到详细的说明!有人能解释一下吗?

class Message
{

    public function sendMessage() {
        echo 132;
        static::doMessage();
        self::doMessage();
    }

    public function doMessage() {
        echo 332;
    }
}
阅读 3.5k
5 个回答

这好像称为后期静态绑定。

http://php.net/manual/zh/lang...

<?php

class Message
{
    // 动态方法下
    public function SM () {
        echo 132, PHP_EOL;
        static::doMessage();
        self::doMessage();
        static::staticDoMessage();
        self::staticDoMessage();
    }
    // 静态方法下
    public static function staticSM () {
        echo 132;
        static::doMessage();
        self::doMessage();
        static::staticDoMessage();
        self::staticDoMessage();
    }
    // 动态方法
    public function doMessage () {
        echo 332, PHP_EOL;
    }
    // 静态方法
    public static function staticDoMessage () {
        echo "end", PHP_EOL;
    }
}

$message = new Message();
// $message->SM();
// 132
// 332
// 332
// end
// end

$message->staticSM();
// 132
// Deprecated: Non-static method Message::doMessage() should not be called statically in E:\yesman\mb\test\php\practice\985.php on line 14
// 332

// Deprecated: Non-static method Message::doMessage() should not be called statically in E:\yesman\mb\test\php\practice\985.php on line 15
// 332
// end
// end

弱语言了解下

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();

以上例程会输出:

A

可以实现在父类中调用子类的静态方法的作用。

后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。

class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails

以上例程会输出:

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

更多可以参考PHP手册: http://www.php.net/manual/zh/...

把这边改一下就可以调用:
class Message
{

public function sendMessage() {
    echo 132;
    static::doMessage();
    self::doMessage();
}

public static function doMessage() {
    echo 332;
}

}

self::xxx();
$this->xxx();

这是2种调用 方法的方式。
static 方法里不能有 $this

根据你实际需要去定义你的function 是 static 还是非 static
然后使用对于的调用方式

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题