簡體   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