なぜPHPでは、型名だけでなく、あるクラスのインスタンスを介して静的メソッドにアクセスできますか?
更新:私は.net開発者ですが、php開発者とも協力しています。最近、インスタンスから呼び出された静的メソッドについてこの瞬間を見つけましたが、なぜそれが役立つのか理解できません。
例:
class Foo
{
public static Bar()
{
}
}
このようなメソッドを受け入れることができます:
var $foo = new Foo();
$foo.Bar(); // ??????
PHPで
クラスは、たとえば新しいキーワードを使用してインスタンス化されます。
$MyClass = new MyClass();
また、スコープ解決演算子またはオブジェクト参照演算子のいずれかを使用して、静的メソッドまたはプロパティにアクセスできます。たとえば、クラスMyClass
に静的メソッドFoo()
が含まれている場合、どちらの方法でもアクセスできます。
$MyClass->Foo();
または
MyClass::Foo()
唯一のルールは、静的メソッドまたはプロパティがオブジェクトコンテキスト外であることです。たとえば、静的メソッド内で$this
を使用することはできません。
Class Do {
static public function test() {
return 0;
}
}
このように使用します:
echo Do::test();
なぜPHPでは、型名だけでなく、あるクラスのインスタンスを介して静的メソッドにアクセスできますか?
.NETでおそらく慣れているものとは異なり、PHPには動的型があります。考慮してください。
class Foo
{
static public function staticMethod() { }
}
class Bar
{
static public function staticMethod() { }
}
function doSomething($obj)
{
// What type is $obj? We don't care.
$obj->staticMethod();
}
doSomething(new Foo());
doSomething(new Bar());
そのため、オブジェクトインスタンスを介して静的メソッドへのアクセスを許可することにより、異なる型で同じ名前の静的関数をより簡単に呼び出すことができます。
->
を介した静的メソッドへのアクセスが許可される正当な理由があるかどうかはわかりません。 PHP(5.3?)もサポートしています:
$obj::staticMethod();
おそらくそれほど混乱しません。 ::
を使用する場合、警告を回避するために静的関数である必要があります(どちらかを許可する->
とは異なります)。
PHP 7では、$this->staticFunction()
を実行できることが絶対に必要であるようです。なぜなら、このコードが抽象クラスおよびstaticFunction()
は抽象クラスでも抽象であり、_$this->
_と_self::
_は異なる結果を提供します!
抽象クラスの(非抽象)子から$this->staticFunction()
を実行すると、child::staticFunction()
になります。すべては順調です。
ただし、抽象クラスの(非抽象)子からself::staticFunction()
を実行すると、parent::staticFunction()
になります。これは抽象であるため、例外をスローします。
これは、不適切に設計されたPHPの別の例に過ぎないと思います。または自分でコーヒーをもっと必要としています...
オブジェクトではなくクラスのコンテキストでメソッドとプロパティにアクセスできると便利な場合があります。これを行うには、静的キーワードを使用できます。したがって、クラス名とスコープ解決を使用して静的メソッドにアクセスできます。
class User
{public static $ name = 'john';
public static function display()
{
return self::$name;
}
}
echo User :: display();
ここで、Userクラスで静的メソッドを宣言しました。したがって、静的メソッドを宣言すると、クラス名だけを使用してそこにアクセスできます。そこにアクセスするためにオブジェクトを作成する必要はありません。すべての手順を理解していただければ幸いです。
注:これは実際には通常のメソッドとの主な違いです。$ thisはそのようなメソッドでは使用できません。
ここから記事全文を読む PHP? で静的プロパティを使用する方法)==
PHPでは、クラスのインスタンスを参照することで静的メソッドにアクセスできますが、必ずしもそうする必要はありません。たとえば、次は静的関数を持つクラスです。
class MyClass{
public static function MyFunction($param){
$mynumber=param*2;
return $mynumber;
}
このようなタイプ名だけで静的メソッドにアクセスできますが、この場合、「->」の代わりに二重コロン(::)を使用する必要があります。
$result= MyClass::MyFunction(2);
(「->」を使用して、クラスのインスタンスを介して静的メソッドにアクセスすることもできます)。詳細: http://php.net/manual/en/language.oop5.static.php