私はこの問題に少し混乱しています。 Ruby on RailsでActiveRecordと非常によく似た振る舞いをしようとするORMクラスを設計していますが、それは重要です。
私が言いたいのは、私のクラスは、特にデータベースとテーブルの処理のために、静的属性の継承を広範囲に使用しているということです。私の質問は、self ::を使用する必要がありますか?
「適切なアプローチで問題をターゲットにしていますか?」と自問する必要があります。
self::
およびstatic::
2つの異なることを行います。例えば self::
または__CLASS__
は現在のクラスへの参照であるため、特定のスコープで定義されているため、転送時に静的呼び出しを行うだけでは十分ではありません。
継承するとどうなりますか?
class A {
public static function className(){
echo __CLASS__;
}
public static function test(){
self::className();
}
}
class B extends A{
public static function className(){
echo __CLASS__;
}
}
B::test();
これは印刷されます
A
一方、static::
期待される動作があります
class A {
public static function className(){
echo __CLASS__;
}
public static function test(){
static::className();
}
}
class B extends A{
public static function className(){
echo __CLASS__;
}
}
B::test();
これは印刷されます
B
これは late static bindingin PHP 5.3. と呼ばれます。これは制限を解決します実行時に参照されたクラスの呼び出し.
それを念頭に置いて、問題を適切に確認して解決できると思います。複数の静的メンバーを継承しており、親メンバーと子メンバーへのアクセスが必要な場合self::
では不十分です。
以下のコードを使用して、selfとstaticの違いを確認してください。
<?php
class Parent_{
protected static $x = "parent";
public static function makeTest(){
echo "self => ".self::$x."<br>";
echo "static => ".static::$x;
}
}
class Child_ extends Parent_{
protected static $x = "child";
}
echo "<h4>using the Parent_ class</h4>";
Parent_::makeTest();
echo "<br><h4>using the Child_ class</h4>";
Child_::makeTest();
?>
この結果が得られます:
Parent_クラスを使用
- 自己=>親
- 静的=>親
Child_クラスを使用
- 自己=>親
- 静的=>子