繁体   English   中英

PHP:如果我以非静态方式调用静态方法怎么办?

[英]PHP: What if I call a static method in non-static way

我不是面向对象编程的专家,我有一个愚蠢的问题:

class test {
    public static function doSomething($arg) {
        $foo = 'I ate your ' . $arg;
        return $foo;
    }
}

所以调用doSomething()方法的正确方法是test::doSomething('Pizza'); , 我对吗?

现在,如果我这样称呼会发生什么:

$test = new test;
$bar = $test->doSomething('Sandwich');

我已经测试了它并且没有任何错误或通知等工作但是这样做是否正确?

正如Baba已经指出的那样,它会产生E_STRICT具体取决于您的配置。

但即使这对您来说没有问题,我认为值得一提的是,以非静态方式调用静态方法可能会导致一些陷阱。

如果你有一个类层次结构

class A {
    public static function sayHello() {
        echo "Hello from A!\n";
    }

    public function sayHelloNonStaticWithSelf() {
        return self::sayHello();
    }

    public function sayHelloNonStaticWithStatic() {
        return static::sayHello();
    }
}

class B extends A {
    public static function sayHello() {
        echo "Hello from B!\n";
    }

    public function callHelloInMultipleDifferentWays() {
        A::sayHello();
        B::sayHello();
        $this->sayHelloNonStaticWithSelf();
        $this->sayHelloNonStaticWithStatic();
        $this->sayHello();
    }
}

$b = new B();
$b->callHelloInMultipleDifferentWays();

这会产生以下输出:

Hello from A!
// A::sayHello() - obvious

Hello from B!
// B::sayHello() - obvious

Hello from A!
// $this->sayHelloNonStaticWithSelf()
// self alweays refers to the class it is used in

Hello from B!
// $this->sayHelloNonStaticWithStatic()
// static always refers to the class it is called from at runtime

Hello from B!
// $this->sayHello() - obvious

如您所见,在混合静态和非静态方法调用和技术时,很容易实现意外行为。

因此,我的建议是:使用Class :: method显式调用您要调用的静态方法。 或者更好的是根本不使用静态方法 ,因为它们使代码不可测试

最好用这种方式调用它来避免在某些版本的PHP上使用E_STRICT

$bar = test::doSomething('Sandwich');

来自PHP DOC

使用箭头运算符 - >无法通过对象访问静态属性。 静态调用非静态方法会生成E_STRICT级别警告。

将类属性或方法声明为静态可使它们无需实例化类的实现。 声明为static的属性无法使用实例化的类对象访问(尽管静态方法可以)。

如果您的方法不使用$this并且不访问静态属性,则没有区别。

使用箭头运算符 - >无法通过对象访问静态属性。

$ this在声明为static的方法中不可用。

但是,你应该总是使用::来调用静态方法,即使通过php让你在一个实例上调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM