-2

PHPでの静的メソッドの使用について疑問に思っていました。public static メソッドを持つクラスがあります。

class Dog{
  public static function sound(){
     $bark = "WOOF!";
     return $bark;
  }
}

$new = new Dog(); 
$new->sound();

致命的なエラーを返します。したがって、このクラスを呼び出すと。新しいインスタンスを作成して呼び出しましたが、エラーが発生しました。それが参照しているオブジェクトは何ですか?非オブジェクトとは何ですか?

ありがとう。

更新:致命的なエラー:非オブジェクトでのメンバー関数の呼び出し

4

7 に答える 7

4

静的メソッドにアクセスします。

Dog::sound();

sound() メソッドを静的に宣言しなかった場合、次のようになります。

$dog = new Dog();
$dog->sound();

したがって、コードは次のようになります。

class Dog{
    public static function staticSound(){
        $bark = "WOOF!";
        return $bark;
    }

    public function objectSound(){
        $bark = 'Woof';
        return $bark;
    }
}

$dog = new dog(); 
echo $dog->objectSound();
echo Dog::staticSound();
于 2013-05-31T08:05:00.027 に答える
2

PHP の静的メソッドは、次のように呼び出されます。

Dog::sound();

静的メソッドと非静的メソッドの違いは、静的メソッドは $this 変数にアクセスできないことです。また、静的メソッドは、クラスのインスタンスではなくクラスで呼び出されます。

注: return ステートメントにタイプミスがあるため、致命的なエラーが発生するだけです。PHP は非常に寛容であり、非静的な方法で静的メソッドを呼び出すことができるため、構文は実際に機能します。

于 2013-05-31T08:06:58.723 に答える
1

静的メソッドを実装するクラスのインスタンスを作成してもかまいません。

そのメソッドを静的に呼び出すことは違法です。

使用する静的メソッドを呼び出す

Dog::sound();

Dog::sound $thisインスタンスではなくクラスで呼び出しているため、 inは使用できません。

おまけに、静的メソッドは次の方法でも呼び出すことができます。

クラス内から

self::sound();
static::sound();

拡張クラスから

static::sound();

どこからでも

$a = array("Dog","sound");
$a();

call_user_func($a);

$d= "Dog"; $s = "Sound";
$d::$s();

$d = new Dog();
$d->sound();
于 2013-05-31T08:05:54.420 に答える
1

非オブジェクトのメンバー関数への呼び出しを$new->sound();トリガーする場合は、オブジェクト ( ) ではない何かに対してメンバー関数 ( ) を呼び出そうとしていることを意味します。それが本当の問題であり、投稿したコードではトリガーできません。実際のコードでそのエラーが発生すると確信していますが、問題を再現しない簡略化されたバージョンを投稿しました。sound()$new

あなたが投稿した単純化されたコードは、もちろん、返された値を出力したり使用したりしないことを除いて、問題なく動作するはずです。少し修正すると、静的メソッドを呼び出す両方の方法が有効であることがわかります。

<?php

error_reporting(-1);

class Dog{
  public static function sound(){
     $bark = "WOOF!";
     return $bark;
  }
}

$new = new Dog();
echo Dog::sound();
echo $new->sound();

実際に見てください。

マニュアルはそれを明示的に述べていないかもしれませんが、暗黙のうちにそれが可能であることを確認しています:

クラスのプロパティまたはメソッドを static として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。
[...]
静的メソッドは作成されたオブジェクトのインスタンスなしで呼び出すことができるため、疑似変数 $this は static として宣言されたメソッド内では使用できません。

義務化されていないことは、禁止されていることと同じではありません。

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

メソッドではなくプロパティ。

非静的メソッドを静的に呼び出すと、E_STRICT レベルの警告が生成されます。

それは反対のことであり、許可されていないと明確に文書化されています

于 2013-05-31T08:35:31.020 に答える
1

PHP では、インスタンスではなく、クラスで静的メソッドを呼び出す必要があります。これは実際には OOP 言語ごとに異なります。これを許可するものもあるため、混乱は理解できますが、PHP が許可しない理由は単純に、強力な型指定がないため、コンパイラが型を安全に判断できないためです$dog。呼び出し。

正しい構文はDog::sound().

于 2013-05-31T08:06:53.067 に答える
1

次のように、インスタンスから静的メソッドを呼び出すことができます。

$dog = new Dog();
$dog::sound();

ただし、このように静的メソッドを呼び出す必要があります

Dog::sound();

参照: http://www.php.net/manual/en/language.oop5.static.php

于 2013-05-31T08:10:21.580 に答える
-3

インスタンス化されたオブジェクトで静的メソッドを呼び出すことはできません。例では次のように呼び出す必要があります。

Dog.sound();

これは、ほとんどの言語で静的メソッドが使用される方法です

于 2013-05-31T08:04:13.103 に答える