私はPHP、OOPを勉強しており、静的にいます。このphp.net/staticでは、この文を理解できませんでした
Calling non-static methods statically generates an E_STRICT level warning.
上記の文でメソッドのみに有効であることはわかりましたが(プロパティには有効ではありません)、実際には理解できませんでした.上記の文を説明するコードを教えていただければ幸いです.週。
私はPHP、OOPを勉強しており、静的にいます。このphp.net/staticでは、この文を理解できませんでした
Calling non-static methods statically generates an E_STRICT level warning.
上記の文でメソッドのみに有効であることはわかりましたが(プロパティには有効ではありません)、実際には理解できませんでした.上記の文を説明するコードを教えていただければ幸いです.週。
これはあなたが尋ねている文でそれらが何を意味するかの例です。
1つのメソッドを持つ次のクラスを検討してください(静的ではありません)。
class Test
{
function method()
{
echo "Hello from method";
}
}
Test::method(); // attempt to statically call a non-static method
これは出力です:
厳格な基準:非静的メソッドTest :: method()は、12行目の/obj.phpで静的に呼び出されるべきではありません。Hellofrom
method
ご覧のとおり、静的メソッドではありませんが、静的メソッドを呼び出すとメソッドが実行されましたが、厳密なエラーメッセージが表示されました。
メソッドmethod()
がキーワードを参照している場合、静的メソッド呼び出しのコンテキストには存在しない$this
ため、致命的なエラーが発生します。$this
したがって、非静的クラスメソッドを静的に呼び出すことは技術的には可能ですが、実行しないでください。
編集:
非静的クラスメンバーを静的に呼び出すことさえ許可されている理由は、静的キーワードがクラスメソッドのコンテキストでPHP4に存在しなかったためです。したがって、静的クラスまたはメソッドをPHP4で設計している場合、示すキーワードがありませんでした。それ、あなたは単にそれを静的な方法で呼ぶでしょう。これで、メソッドが静的に呼び出されたが、宣言にstaticキーワードが含まれていない場合、PHP5は警告を発します。
class Foo
{
public static $my_static = 'foo';
public $my_non_static = 'bar';
public function staticValue() {
return self::$my_static;
}
public function nonStaticValue() {
return self::$my_non_static;
}
}
print Foo::$my_static . "\n"; // OK
print Foo::staticValue(). "\n"; // E_STRICT
print Foo::$my_non_static . "\n"; // Fatal
print Foo::nonStaticValue(). "\n"; // Fatal
print Foo::$my_static . "\n";
OK-静的にアクセスされる静的プロパティ。
print Foo::staticValue(). "\n";
E_STRICT-静的にアクセスされる非静的メソッドを提供しますが、このメソッドは非静的プロパティにアクセスしないため、致命的なエラーは発生しません。
非静的フィールドには静的にアクセスできないため、他の2つは致命的なエラーを発生させます。
非静的メソッドを静的に呼び出すことができたとしても、そうすべきではなく、ログに記録されるためです。
class Foo {
function bar(){
print "you should not do that";
}
}
Foo::bar();
実際には機能しますが、それができるのでE_STRICT警告が表示されますが、そうではありません。
メソッドが非静的である場合、それはクラスのインスタンスに属していることを意味します。たとえば、(車の損傷の程度を計算する)Car
というメソッドを持つクラスがある場合、このメソッドを静的な方法で呼び出さないでください。getDamage()
Car
クラスのインスタンスのみを作成し、getDamage()
そのインスタンスを呼び出す必要があります。特定の車が25%損傷する可能性があり、別の車が70%損傷する可能性があるため、これは理にかなっています。
ただし、静的な方法で呼び出すことgetDamage()
は意味がありません。静的メソッドは、クラスの特定のインスタンスではなく、クラス自体に属します。また、Car
クラスには、の結果を与える便利な方法がありませんgetDamage()
。(おそらく0
)値を計算することはできますが、意味がありません。