PHPでの静的バインディング、varsは子クラス間で共有されています
-
12-12-2019 - |
質問
多分私の質問は数回尋ねられましたが...
次のコード
abstract class ParentClass
{
protected static $count=0;
public static function inc()
{
static::$count++;
}
public static function getCount()
{
return static::$count;
}
}
class FirstChild extends ParentClass
{
}
class SecondChild extends ParentClass
{
}
.
そして私はこののようにそれを使います
FirstChild::inc();
echo SecondChild::getCount();
.
私は「1」を示しています。そしてあなたがおそらくあなたが「0」が必要なと思います:)
私は2つの方法を見ます:
- 各デリバティブクラスへの
protected static $count=0;
を追加する -
$count
を整数ではなく配列にします。そしてinc
およびgetCount
メソッドにそのようなものの種類を実行する:static :: $ COUNT [GET_CALLED_CLASS()] ++;
と
.return static::$count[get_called_class()];
しかし、これらの方法は少し醜いと思います。最初の - 私はコピー/ペーストをします、私が避けたいこと。2番目の、私は知りません:)私はただ好きではありません。
私が欲しいものを達成するためのより良い方法はありますか?
事前にありがとうございました。
解決
いいえ、これに対処するために最も実用的な2つのオプションを正確にレイアウトしました。PHPは魔法を働かせることはできません。static
protected
プロパティを宣言すると、 one プロパティとまさにそれが得られます。あなたが与える構文がそれをする必要がある人のための良いニュースかもしれませんが、それはPHP OOPが幾分SANEマナーで行動することを期待する他のすべての人のための絶対的な恐ろしいニュースであるでしょう。
およびレコードの場合、例外なしに派生クラスすべてに個別のカウンタを必要としない場合は、美しいソリューションになる必要がある派生クラスで明示的なprotected static $count = 0
を検討します。1つのために、そしてその事実は全員のためのコードに書かれたままです。
他のヒント
あなたがやろうとしていることを考えて、抽象クラスのインターフェースメソッド(getcount()など)と派生クラスのカウンタは、最初の選択肢であると考えています。そのカウントのすべてのインスタンスをカウントしていない場合は、親クラスに抽象的な静的カウントを持つことは理にかなりません。
一般的に、私は全体の考えが少し醜いと思います、したがって実装も醜いでしょう:)
保護された静的$ count= 0を宣言することができます。子クラスごとに、そのようにして、子クラスごとに一意になるが、クラスのすべてのインスタンスには一般的になります。それは彼の問題に対する最もエレガントな解決策です。
abstract class ParentClass
{
public static function inc()
{
static::$count++;
}
public static function getCount()
{
return static::$count;
}
}
class FirstChild extends ParentClass
{
protected static $count=0;
}
class SecondChild extends ParentClass
{
protected static $count=0;
}
.