在类中调用静态方法?

时间:2010-02-04 23:29:46

标签: php

如何从同一个类中的另一个方法调用静态方法?

$this->staticMethod();

$this::staticMethod();

5 个答案:

答案 0 :(得分:276)

答案 1 :(得分:39)

我们假设这是你的班级:

class Test
{
    private $baz = 1;

    public function foo() { ... }

    public function bar() 
    {
        printf("baz = %d\n", $this->baz);
    }

    public static function staticMethod() { echo "static method\n"; }
}

foo()方法中,让我们看一下不同的选项:

$this->staticMethod();

所以调用staticMethod()作为实例方法,对吗?它不是。这是因为该方法声明为public static,解释器将其称为静态方法,因此它将按预期工作。可以说,这样做会使代码中的静态方法调用变得不那么明显。

$this::staticMethod();

自PHP 5.3起,您可以使用$var::method()来表示<class-of-$var>::;这是非常方便的,尽管上面的用例仍然非常传统。因此,我们采用了最常见的调用静态方法的方法:

self::staticMethod();

现在,在您开始认为:: 静态调用运算符之前,让我再举一个例子:

self::bar();

这将打印baz = 1,这意味着$this->bar()self::bar()完全相同;那是因为::只是一个范围解析运算符。它可以使parent::self::static::工作,并允许您访问静态变量;如何调用方法取决于其签名以及调用者的调用方式。

要查看所有这些内容,请参阅this 3v4l.org output

答案 2 :(得分:8)

这是一个非常晚的回应,但前两个回答有点误导。

在同一个类的另一个静态方法中调用PHP中的静态方法时,区分self和类名是很重要的。

以此代码为例:

class static_test_class {
    public static function test() {
        echo "Original class\n";
    }

    public static function run($use_self) {
        if($use_self) {
            self::test();
        } else {
            $class = get_called_class();
            $class::test(); 
        }
    }
}

class extended_static_test_class extends static_test_class {
    public static function test() {
        echo "Extended class\n";
    }
}

extended_static_test_class::run(true);
extended_static_test_class::run(false);

此代码的输出为:

  

原创课程

     

扩展课程

这是因为self引用了代码所在的类,而不是它所调用的代码类。

如果要使用在继承原始类的类上定义的方法,则需要使用以下内容:

$class = get_called_class();
$class::function_name(); 

答案 3 :(得分:2)

在以后的PHP版本class Foo { public function fun1() { echo 'non-static'; } public static function fun2() { echo (new self)->fun1(); } } 中也不起作用。它会引发严格的标准错误。

在这种情况下,我们可以创建相同类的对象并按对象调用

这是示例

Apr 21 15:42:26 concourse-worker concourse[24460]: {"timestamp":"1492789346.467736244","source":"worker","message":"worker.beacon.restarting","log_level":2,"data":{"error":"failed to dial: failed to construct client connection:%!(EXTRA *errors.errorString=ssh: handshake failed: remote host public key mismatch)","session":"3"}}

答案 4 :(得分:0)

在类中调用静态方法

className::staticFunctionName

示例

ClassName::staticMethod();