<?php
class Person{
public static $name = 'Voyager';
public static function say(){
echo 'My name is ' . self::$name;
}
}
1.はじめに
- 直接アクセスするためにクラスをインスタンス化する必要はありません。
- メモリにはコピーが1つだけあり、すべてのインスタンスで共有されます。
- アクセス速度は、インスタンス化アクセスよりも高速です。
- 非静的プロパティとメソッドは静的メソッドではアクセスできません(まだ作成されていない、速度の理由)。
- インスタンス化されたオブジェクトを介して静的プロパティにアクセスすることはできませんが、静的メソッドにはアクセスできます。
- 変数またはメソッドとして直接定義することはできません。詳細については、3を参照してください。
- 定義後、自動的にリサイクルされることはありません。詳細については、4を参照してください。
2.アクセス方法
静的プロパティにアクセスする
Person::$name;
$me = new Person();
echo $me::$name;
静的メソッドにアクセスする
Person::say();
$me = new Person();
$me::say();
$me = new Person();
$me->say();//php7说静态调用非静态方法将被弃用
3、不定の値に初期化します
staticの値が不定なのはなぜですか?たとえば、注文のバッチを処理するメソッドでは、1日の始まりに乱数またはタイムスタンプが必要です。一度初期化してから、この値を注文処理のこのバッチに使用する必要がありますが、次のバッチは異なります。
<?php
class Person{
public static $age = 2018-1994;#正确
public static $number1 = self::$age; #错的
public static $number2 = mt_rand(18,24); #错的
public static $number3;
#正确
public static function init(){
if(!self::$number3){
self::$number3 = mt_rand(18,24);
}
}
#正确
public function __construct(){
if(!self::$number3){
self::$number3 = mt_rand(18,24);
}
}
}
// init
Person::init();
echo Person::$number3;
// __construct
$a = new Person();
$b = new Person();
echo $a::$number3;
echo '<br />';
echo $b::$number3;
第四に、メソッドの静的
<?php
function increment1(){
static $n = 0;
$n++;
echo $n;
}
increment1(); #1
increment1(); #2
increment1(); #3
//输出‘123’
function increment2(){
$n = 0;
$n++;
echo $n;
}
increment2(); #1
increment2(); #1
increment2(); #1
//输出‘111’