PHPの静的プロパティと静的メソッドの基本と使い方を解説
PHPのクラスでは、staticキーワードを使って宣言されたプロパティやメソッドは、インスタンス化されたオブジェクトから->演算子でアクセスすることができません。そもそも静的なメンバーは、オブジェクト(インスタンス)を作成しなくてもアクセスできるのが特徴です。また、クラス内の静的メンバーのデフォルトの可視性はpublicです。
静的プロパティ(static property)とは
クラスの外部から静的プロパティにアクセスするには、スコープ定義演算子(::)をクラス名と組み合わせて使用します。さらに、クラス名を格納した文字列変数を使って静的プロパティにアクセスすることも可能です。
<?php
class testclass{
static $name="test";
}
echo testclass::$name;
$var="testclass";
echo $var::$name;
?>
同じクラス内からアクセスする(self)
同じクラス内のメソッドから静的プロパティを使用する場合は、インスタンスプロパティへのアクセスに使う->演算子の代わりに、selfキーワードを使用します。
<?php
class testclass{
static $name="test";
public function test(){
echo self::$name;
}
}
$obj=new testclass();
$obj->test();
?>
子クラスから親クラスの静的プロパティにアクセスする(parent)
親クラスで宣言された静的プロパティは、子クラスのメソッド内でparentキーワードとスコープ定義演算子(::)を組み合わせることで参照できます。これは継承関係において非常に便利な機能です。
<?php
class testclass{
static $name="test";
public function test(){
echo self::$name;
}
}
class myclass extends testclass{
public function mytest(){
echo parent::$name;
}
}
$obj=new myclass();
$obj->mytest();
?>
静的メソッド(static method)とは
メソッドをstaticとして宣言すると、擬似変数$thisが利用できなくなります。そのため、静的メソッドの中ではクラスのインスタンス属性(通常のプロパティ)にアクセスすることはできません。静的メソッドは、クラス名とスコープ定義演算子(::)を組み合わせて呼び出します。
実例:オブジェクトの生成回数をカウントする
次の例では、クラスに静的プロパティ$countを持たせ、コンストラクタが実行されるたび(つまりオブジェクトが生成されるたび)に値を1ずつ増加させています。そして、静的プロパティの値を取得するための静的メソッドをクラス内に定義しています。
<?php
class testclass{
static $count=0;
function __construct(){
self::$count++;
}
static function showcount(){
echo "count = " . self::$count;
}
}
$a=new testclass();
$b=new testclass();
$c=new testclass();
testclass::showcount();
?>
出力結果
上記のコードを実行すると、次の出力が得られます。
count = 3
このように、静的プロパティはすべてのインスタンス間で共有されるため、オブジェクト指向プログラミングにおけるカウンター処理や設定値の管理など、さまざまな場面で活用できます。
-
JavaScriptでクラスに静的メソッドを割り当てる方法
JavaScriptでクラスに静的メソッド(staticメソッド)を割り当てるには、メソッドの前にstaticキーワードを付けるだけです。静的メソッドは、クラスをインスタンス化することなく、クラス名から直接呼び出すことができます。 静的メソッドはクラスそのものに属するため、個々のインスタンスの状態に依存しないユーティリティ関数や計算処理などに適しています。なお、静的メソッドはインスタンスからは呼び出せず、必ずクラス名を介して呼び出す必要がある点に注意しましょう。 以下は、JavaScriptでクラスに静的メソッドを割り当てるコード例です。 コード例 <!DOCTYPE html>
-
抽象クラスとインターフェースの違いを徹底解説
抽象クラスとインターフェースの違いとはJavaなどのオブジェクト指向プログラミング言語では、抽象クラスとインターフェースはどちらも「抽象的な型」を定義するために使用されます。しかし、両者には明確な違いがあり、適切に使い分けることがプログラム設計の質を大きく左右します。抽象クラスの特徴抽象クラスは、インスタンスメソッドとしてデフォルトの動作(具体的な実装)を持つことができます。そのため、複数の子クラスで共有する共通処理をあらかじめ実装しておくことが可能です。また、コンストラクタやインスタンスフィールド(状態)を持つこともできます。インターフェースの特徴一方、インターフェースは定数とインスタンスメ