web-dev-qa-db-ja.com

PHP static ::はself ::?を置き換えることができますか?

私はこの問題に少し混乱しています。 Ruby on RailsでActiveRecordと非常によく似た振る舞いをしようとするORMクラスを設計していますが、それは重要です。

私が言いたいのは、私のクラスは、特にデータベースとテーブルの処理のために、静的属性の継承を広範囲に使用しているということです。私の質問は、self ::を使用する必要がありますか?

52
elite5472

「適切なアプローチで問題をターゲットにしていますか?」と自問する必要があります。

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::では不十分です。

104
DarkThrone

以下のコードを使用して、selfstaticの違いを確認してください。

<?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_クラスを使用

  • 自己=>親
  • 静的=>子
10
Radouane FADEL