ホームページ >バックエンド開発 >PHPチュートリアル >PHP オブジェクト指向の旅: 静的変数とメソッド_PHP チュートリアル
static キーワードは、属性またはメソッドがクラスの特定のインスタンスではなく、クラスに関連していることを宣言するため、このタイプの属性またはメソッドは「クラス属性」または「クラス メソッド」とも呼ばれます。
アクセス制御権限が許可されている場合は、このクラスのオブジェクトを作成せずに、クラス名と 2 つのコロン「::」を使用して直接呼び出すことができます。
static キーワードは変数とメソッドを変更するために使用できます。
インスタンス化せずに、クラス内の静的属性と静的メソッドに直接アクセスできます。
静的プロパティとメソッドは静的プロパティとメソッドにのみアクセスでき、非静的プロパティとメソッドにはクラスからアクセスできません。静的プロパティと静的メソッドが作成されるとき、呼び出すことができるこのクラスのインスタンスがまだ存在しない可能性があるためです。
静的属性はメモリ内に 1 つのコピーのみを持ち、すべてのインスタンスによって共有されます。
現在のクラスの静的メンバーにアクセスするには、self:: キーワードを使用します。
静的プロパティの公開機能
クラスのすべてのインスタンスは、クラス内の静的プロパティを共有します。
言い換えると、メモリ内に複数のインスタンスがあっても、静的属性のコピーは 1 つだけです。
以下の例では、カウンター $count 属性が設定されており、プライベートおよび静的な変更が行われています。このようにして、外部の世界は $count プロパティに直接アクセスできなくなります。プログラムを実行した結果、複数のインスタンスが同じ静的 $count 属性を使用していることもわかります。
次のようにコードをコピーします
class user{
private static $count = 0; //すべてのユーザーのログイン状態を記録します。
public function __construct(){
self::$count = self::$ count + 1;
}
public function getCount(){
return self::$count;
}
public function __destruct(){
$count = self::$count -1;
}
}
$user1 = new user();
$user2 = new user();
$user3 = new user();
echo "ここに ".$user1->getCount() があります。" user";
echo "< br> ;";
unset( $user3);
echo "ここに「.$user1->getCount()」があります。" user";
?>
プログラムの実行結果:
1
2
現在ここに 3 人のユーザーがいます
今ここに 2 人のユーザーがいます bKjia.c0m
静的属性は直接呼び出されます
静的プロパティはインスタンス化せずに直接使用でき、クラスが作成される前に直接使用できます。
使用するメソッドはクラス名::静的プロパティ名です。
codeコードは次のとおりです。コードコード&lt;?
$r = 3;
echo "半径 $r の面積は
";
echo Math::$pi * $r * $r ;
echo "
";
//ここでは 3.14 では十分な精度が得られないと思うので、より正確になるように設定しました。
Math::$pi = 3.141592653589793;
echo "半径 $r の面積は
";
echo Math::$pi * $r * $r ;
?>
プログラム実行結果:
1
2
3
4
28.26
半径3のエリアは
28.2743338823
クラスは作成されず、静的プロパティを直接使用できます。静的プロパティはいつメモリ内に作成されますか? PHP には関連する情報がありません。 Java の概念を引用して説明することも普遍的である必要があります。
静的プロパティとメソッド。クラスが呼び出されたときに作成されます。クラスが呼び出されるときは、クラスが作成されるか、クラス内の静的メンバーが呼び出されることを意味します。
静的メソッド
静的メソッドは、クラスをインスタンス化せずに直接使用できます。
使用するメソッドはクラス名::静的メソッド名です。
数学的な計算を実行するために、この Math クラスの作成を続けましょう。最大値を計算する方法を設計します。これは数学的な演算であるため、このクラスをインスタンス化する必要はありません。このメソッドを使用できればさらに便利です。
次のようにコードをコピーします
& lt ;?
Class Math {public static function max ($ num1, $ num2) {
Return $ NUM1 & GT? }}}} $ a = 99;
$b = 88;
echo "
";
echo Math::Max($a ,$b);
echo "
";echo "
";echo "
";
$a = 99;
$b = 100;
echo "間の最大値を表示$a と $b は";
echo "
";
echo Math::Max($a,$b);
?>
プログラム実行結果:
$ a、$ bの最大値が
99であることを示す
$ a、$ bの最大値が
100であることを示す
staticメソッドによるstaticメソッドの呼び出し方法
最初の例は、静的メソッドが他の静的メソッドを呼び出すときに、クラス名を直接使用します。
コードは以下の通り コードをコピー
// 最大値比較を実装する数学クラス。クラス Math {
$num1 = Math::Max($num1,$num2); $num2 = return $num1;
}
}
$a = 99;
$b = 77;
$c = 88;
エコー"Show $a $b $c 最大値は";
echo "
";
echo Math::Max3($a,$b,$c);
?>
プログラム実行結果:
1
2
99 77 88の最大値が
99
であることを表示
self:: を使用して、現在のクラス内の他の静的メソッドを呼び出すこともできます。 (提案)
コードは以下の通り コードをコピー
// 最大値比較を実装する数学クラス。クラス数学 {
$num1 = self::Max($num1,$num2); $num2 = return $num1;
}
}
$b = 77;
$c = 88;
echo "
";
echo Math::Max3($a,$b,$c);
?>
プログラム実行結果:
1
2
99 77 88の最大値が
99
静的メソッド呼び出し静的プロパティ www.111Cn.Net
このクラスの静的プロパティを呼び出すには、クラス名::静的プロパティ名を使用します。
以下のコードをコピーします
//
class Circle{
public static $pi = 3.14;
public static functioncircleAcreage($r){
return $r * $r * Circle::$pi;
}
$r = 3;
echo "半径 $r の円の面積は" Circle::circleAcreage($r);
?>
プログラム実行結果:
1
self:: を使用して、このクラスの静的プロパティを呼び出します。 (提案)
以下のコードをコピーします
//
class Circle{
public static $pi = 3.14;
public static functioncircleAcreage($r){
return $r * $r * self::$pi;
}
}
$r = 3;
echo "半径 $r の円の面積は" Circle::circleAcreage($r);
プログラムの実行結果:
1
半径3の円の面積は28.26です
静的メソッドは非静的プロパティを呼び出すことはできません。 self:: を使用して非静的プロパティを呼び出すことはできません。
次のようにコードをコピーします
//
class Circle{
public $pi = 3.14;
public static function CircleAcreage($r){
return $r * $r * self::pi;
}
}
$r = 3;
echo "半径 $r の円の面積は" です。 Circle::circleAcreage($r);
プログラムの実行結果:
1
致命的なエラー: E:PHPProjectstest.php の 7 行目で未定義のクラス定数 'pi'
以下のコードをコピーします
//
class Circle{
public $pi = 3.14;
public static functioncircleAcreage($r){
return $r * $r * $this->pi ;
}
}
$r = 3;
echo "半径$rの円の面積は" .
プログラムの実行結果:
1
致命的なエラー: E:PHPProjectstest.phpの7行目でオブジェクトコンテキストにないときに$thisを使用しています
静的メソッドが非静的メソッドを呼び出しています
PHP5 では、静的メソッドで $this 識別子を使用して非静的メソッドを呼び出すことはできません。
コードは次のとおりです コードをコピーします
// 最大値の比較を実装する数学クラス。
class Math{
public function Max($num1,$num2){
echo "bad
";
return $num1 : $num2;
}
public static function Max3($num1) . ->Max($num1,$num2); >最大値は ";
echo "
";
echo Math::Max3($a,$b,$c);
? >
プログラムの実行結果:
99 77 188 の最大値が
Fatal error: using $this when not in object context in E:wwW.111cn.neT test.php on line 10
クラス内の非静的メソッドが self:: によって呼び出される場合、システムはこのメソッドを自動的に静的メソッドに変換します。
次のコードが実行され、結果が生成されました。 Max メソッドはシステムによって静的メソッドに変換されるためです。
コードは以下の通り コードをコピー
// 最大値比較を実装する数学クラス。
class Math{
return $num1 > $num1 : $num2;
} public static function Max3($num1,$num2,$num3){
$num1 = self::Max($num1,$num2);
$num1 = self::Max($num1,$num2);
return $ num1;
}
}
$a = 99;
$b = 77;
$c = 188;
echo "$a $b $c を表示します。最大値は";
echo "
"; echo Math::Max3($a,$b,$c);
?>
プログラムの実行結果:
1
2
は99 77 188の最大値が
188
であることを示しています
次の例では、静的メソッド Max3 が self:: を使用して非静的メソッド Max を呼び出し、非静的メソッド Max が $this を通じて非静的プロパティ $pi を呼び出すようにします。
実行時にエラーが報告されました。このエラーは、前の例 3-1-9.php と同じです。今回は、非静的メソッド Max が静的メソッドによる非静的プロパティの呼び出しのエラーを報告しました。
コードは次のとおりです コードをコピーします
class Math{
public $pi = 3.14;public function Max($num1,$num2){
echo self::$pi; //ここでの呼び出しには問題はありません。Return $num1 > ; $num2 ? $num1 : $num2;
}パブリック静的関数 Max3($num1,$num2,$num3){
$num1 = self::Max($num1,$num2);$num2 = self: : Max ($num2, $num3); 188;
echo "$a $b $c の最大値を表示します";echo "
";
echo Math::Max3($a,$b) ,$c);
?>
プログラム実行結果:
1
2
99 77 188の最大値が表示される
致命的エラー: 未宣言の静的プロパティへのアクセス: Math::$pi in E:PHPProjectstest.php on line 7
詳細については、http://www.bKjia.c0m/phper/php/56640.htmをご確認ください