PHP 5.3+
長い質問で申し訳ありませんが、これを完全に学びたいです。
クラスをオブジェクトとしてインスタンス化せずに、静的メソッド内から非静的の同じクラスメソッドを呼び出すことはできないことを私は知っています。
class Person
{
private $people_array;
function data_all_get()
{ // touch database, return array of people
$this->people_array = // etc dbquery results
}
static function showPeople()
{ // call class method
$people_data = $this->data_all_get();
// Fatal error: Using $this when not in object context
}
} // end class Person
SO を検索したところ、興味深いアプローチがいくつか見つかりましたが、それぞれのアプローチがコード環境にどのように影響するのか疑問に思っていました。
私の質問は以下のとおりです。
クラスを静的メソッド内のオブジェクトとしてインスタンス化して、非静的メソッドにアクセスすることができます
static function showPeople()
{ // instantiate as object
$person = New Person();
// call class method
$people_data = $this->data_all_get();
}
Q1 - これによりどのような問題が発生する可能性がありますか? 私の状況では、クラスにはコンストラクターがないため、他のクラス メソッドや変数はインスタンスの影響を受けません。この新しいオブジェクトは、スクリプトの実行中にメモリ内のスペースを少し占有するだけでしょうか? 悪くないようです...
もう1つのオプションは、「data_all_get」メソッドを静的メソッドに変換することです。これにより、静的メソッド「showPeople」内から呼び出すことができます。
self::showPeople()
「data_all_get」メソッドは、プライベート var の値を設定するために、すでに設定されている場合はデータベースへのトリップを減らすために、オブジェクトとしてインスタンス化されるときに、クラス内の他のメソッドによって使用されています。これはおそらくコンストラクター関数の一部である可能性があることはわかっていますが、この「Person」オブジェクトをphpスクリプトリクエストごとに複数回インスタンス化する必要はありません。クラスは主に、関数と変数をグループ化して編成するために使用されます.. .
Q2 - 「data_all_get」を静的メソッドにすることの意味は何ですか? いずれかがあります?メソッドが静的であるが、プライベート var $people_array (静的ではない) の値を設定する場合、オブジェクトを一度に 2 回インスタンス化する必要がある場合、var を更新または上書きできると思います。スクリプト リクエストですね。さらに、プロパティは静的ではないため、クラスの他のメソッドがアクセスできます。
Q3 - 静的メソッド「data_all_get」を「何も壊さずに」何度でも呼び出すことができますか (読み込まれた質問 IK)。
Q4 - 静的メソッドが呼び出されるたびに追加のメモリを使用するだけですか?
ありがとうございました