26

私はオブジェクト指向プログラミングのプロではありませんが、ばかげた質問を受けました。

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');

私はそれをテストしましたが、エラーや通知などなしに動作していますが、これを行うのは正しいですか?

4

3 に答える 3

17

馬場がすでに指摘したように、それ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を使用して、呼び出す予定の静的メソッドを明示的に呼び出します。または、静的メソッドを使用しない方がよいでしょう。静的メソッドを使用すると、コードがテストできなくなります。

于 2012-10-13T16:48:10.417 に答える
4

$thisメソッドが静的プロパティを使用せず、アクセスしなくても違いはありません。

矢印演算子 -> を使用してオブジェクトから静的プロパティにアクセスすることはできません。

$this は、静的として宣言されたメソッド内では使用できません。

::ただし、 phpを使用してインスタンスで呼び出す場合でも、常に静的メソッドを呼び出す必要があります。

于 2012-10-13T15:17:15.993 に答える
3

E_STRICT一部のバージョンの PHP では回避するために、この方法で呼び出す方がよいでしょう。

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

PHPドキュメントから

矢印演算子 -> を使用してオブジェクトから静的プロパティにアクセスすることはできません。非静的メソッドを静的に呼び出すと、E_STRICT レベルの警告が生成されます。

また

クラスのプロパティまたはメソッドを static として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。静的として宣言されたプロパティは、インスタンス化されたクラス オブジェクトではアクセスできません (ただし、静的メソッドではアクセスできます)。

于 2012-10-13T15:13:38.097 に答える