8

次のコードでは、nonStatic() は静的メソッドではありません。それでも、オブジェクトを作成せずに(静的な方法で)アクセスできます。これはJavaのような他の言語では不可能であるため、誰かが理解するのを手伝ってくれませんか?

<?php
class MyClass
{
    function nonStatic() {
        echo "This can be printed";
    }
}
MyClass::nonStatic(); // This can be printed
4

3 に答える 3

6

許可されていますが、警告生成されます。E_STRICT

Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context

PHP の以前の OO 実装では、これは暗黙のうちに許可されていましたが、その後、より良いプラクティスが採用されました。

ただし、逆の場合は問題なく機能します。

class Test
{
    function foo()
    {
        echo $this->bar();
    }

    static function bar()
    {
        return "Hello world\n";
    }
}

$x = new Test;
$x->foo();

これは印刷されHello worldます。

于 2012-05-01T02:19:18.713 に答える
3

PHP の開発者は、非静的メソッドへの静的アクセスを禁止することに何の価値もないように思われます。これは、実際には目的を果たさない PHP の特異な機能の 1 つにすぎません。非静的メソッドを静的に呼び出すことは確かに悪いプログラミング手法ですが、PHP ではそれが可能です。PHP の将来のバージョンではこれが禁止されるかもしれませんが、今のところ、これは言語の一部にすぎません。

編集:

ありがたいことに、その逆は許可されていません。オブジェクト コンテキストから静的メソッドを呼び出すことはできません。Jack が以下で指摘したように、オブジェクト コンテキストから静的メソッドを呼び出すことができます。OOP パラダイムではほとんどベスト プラクティスではありませんが、許可されています。

于 2012-05-01T02:10:55.317 に答える
0

確かではありませんが、おそらく PHP の魔法のようなものです (そのような場合もあります) が、それを行うべきではありません。

ここで詳細を読むhttp://php.net/manual/en/language.oop5.static.php

同様の例も示されていますが、次の点に注意してください。

非静的メソッドを静的に呼び出すと、E_STRICT レベルの警告が生成されます。これは、この魔法の能力が将来のバージョンで消える可能性があることを意味します。だからやらないでください:)

于 2012-05-01T02:09:55.117 に答える