PHP の静的メソッドの場合は、関数または変数の前に static を追加するだけで、インスタンス化する必要はありません。いくつかの例を示します。 . 静的メソッドのインスタンス。
PHP も例外ではありません!いわゆる静的メソッド (プロパティ) は、static キーワードでマークされたプロパティまたはメソッドです (例: static プロパティ public static username;)
静的メソッドと非静的メソッドの最大の違いは、ライフサイクルが異なることです。例を使って説明しましょう。
静的メソッドの定義
静的メソッドを定義するのは非常に簡単です。たとえば、キーワード関数を宣言する前に static を追加します。
コードは次のとおりです
コードをコピー |
|
クラスA
{
静的関数 fun()
{
// 何かをします
}
}
|
静的メソッドの使用法
使用する場合は、静的変数と同様に、インスタンス化する必要はありません。たとえば、:: を使用して呼び出すことができます。
コードは次のとおりです
コードをコピー
|
|
A::楽しい()
| 通常の方法との比較
静的メソッドの呼び出しにはインスタンス化が必要ないため、静的メソッドでクラス自体のプロパティまたはメソッドを参照するとエラーが発生します。つまり、self と $this の形式が間違っています。
コードは次のとおりです
コードをコピー
|
|
クラスMyClass
{
パブリック $num = 5;
関数__construct()
{
$this->num = 10;
}
関数 fun_1()
{
echo "私は fun_1.n という名前のパブリック メソッドです";
echo "オブジェクトの数は {$this->num}.n です";
}
静的関数 fun_2()
{
echo "私は fun_2.n という名前の静的メソッドです";
}
関数 fun_3($n)
{
echo "引数は {$n}n です";
}
}
$m = 新しい MyClass;
$m->fun_1();
$m->fun_2();
$m->fun_3('テスト');
MyClass::fun_1();
MyClass::fun_2();
MyClass::fun_3('テスト');
出力結果:
lch@localhost:php $php class_method.php
私は fun_1 という名前のパブリック メソッドです。
オブジェクトの数は10です。
私は fun_2 という名前の静的メソッドです。
引数はテストです
私は fun_1 という名前のパブリック メソッドです。
PHP の致命的なエラー: /Users/lch/program/php/class_method.php の 14 行目でオブジェクト コンテキストにないときに $this を使用しています
別の例を見てください
例を使用して説明します。
コードは次のとおりです |
コードをコピー |
クラスユーザー{
public static $username //静的プロパティを宣言します
public $password; //非静的プロパティを宣言します
関数 __construct($pwd) {
echo ‘Username:’,self::$username //静的属性を出力します ;
self::$username = 'admin' //静的属性に値を割り当てます ;
$this->password = $pwd; //非静的プロパティに値を割り当てます
}
public function show(){ //クラス属性を出力します
エコー「 」
ユーザー名:',self::$ユーザー名;
エコー「 」
パスワード:',$this->パスワード;
}
パブリック静的関数 sshow(){
エコー「 」
ユーザー名:',self::$ユーザー名;
エコー「 」
パスワード:',$this->パスワード;
}
}
user::$username = 'root' //ユーザークラスの静的属性に値を代入します ;
$objUser = new user(’123456’) //ユーザークラスをインスタンス化します ;
$objUser->sshow();
unset($objUser);
エコー「 」
ユーザー名:',ユーザー::$ユーザー名;
/*
* 出力結果は次のとおりです:
* ユーザー名:root
* ユーザー名:管理者
* パスワード:123456
*ユーザー
ame:管理人
* */
|
この例からわかるように、静的プロパティはクラスがインスタンス化される前に機能し、オブジェクトが破棄されても静的プロパティは引き続き機能します。
また、静的メソッドのこの特性のため、静的ではないプロパティやメソッドを静的メソッドで呼び出すことはできません
続きを読む
1. PHP クラスでは、すべてのプロパティとメソッドの可視性がパブリックであると仮定すると、クラスのメソッドやプロパティに外部からアクセスするときは、オブジェクト [クラスのインスタンス化プロセス] を通じて呼び出す必要があります。
例:
コードは次のとおりです |
コードをコピー |
クラスログ
{
パブリック $root = DIRECTORY_SEPARATOR;
パブリック $logPath = '/data/app/www/test-realtime.monitoring.c.kunlun.com/log';
パブリック $defaultDir = 'デフォルト';
パブリック関数 writeLog($logName, $logType, $data, $newDir = FALSE)
{
$fileName = '';
If (!file_exists($this->logPath))
{
mkdir($this->logPath, 0777);
}
If ($newDir !== FALSE)
{
@mkdir($this->logPath.$this->root.$newDir, 0777);
$fileName = $this->logPath.$this->root.$newDir.$this->root.date('Y-m-d', time()).'_'.$logName.'_' .$logType.'.log';
}
その他
{
@mkdir($this->logPath.$this->root.$this->defaultDir, 0777);
$fileName = $this->logPath.$this->root.$this->defaultDir.$this->root.date('Y-m-d', time()).'_'.$logName .'_'.$logType.'.log';
}
file_put_contents($fileName, date('Y-m-d H:i:s').' '.$data."n", FILE_APPEND);
}
}
|
クラスのオブジェクトをインスタンス化するプロセス: $logObj = new Log();
クラス内のメソッドにアクセスします: $logObj->writeLog($param1, $param2, $param3, $param4);
クラス内のプロパティにアクセス: echo $logObj->root;
2. クラス内の属性が static キーワードによって変更された場合、オブジェクトを通じて static に変更された属性にアクセスすることはできません。ただし、クラス内のメソッドが static によって変更された場合は、オブジェクトまたはクラス名: : メソッド名によってアクセスされます。
3. クラス内のメソッドが static によって変更される場合、$this はそのクラスのインスタンス化されたオブジェクトを参照するため、オブジェクトを渡さずに呼び出すことができます。利用できません。
|
http://www.bkjia.com/PHPjc/632676.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632676.html技術記事 PHP の静的メソッドの場合は、関数または変数の前に static を追加するだけで、静的変数をインスタンス化する必要はありません。次に実行してみましょう。