1

Cでは(私がよく覚えていれば)それを行うことができます:

void foo()
{
    static bool firstCall = true;

    if(firstCall)
    {
        // stuff to do on first call

        firstCall = false;
    }

    // more stuff
}

同じメソッドが複数回呼び出されたときにモデルがデータベースに複数回クエリを実行しないように、PHPでこれを実行したいと思います。

class User
{
    public static function & getAll($reload = false)
    {
        static $result = null;

        if($reload && null === $result)
        {
            // query the database and store the datas in $result
        }

        return $result;
    }
}

許可されていますか?それは機能しますか?PHP <5.3と互換性がありますか?

はいの場合、私は別の質問があります:

すべてのモデルに共通するいくつかのメソッドがあるとしましょう。それらを抽象基本クラスにグループ化します。

abstract class AbstractModel
{
    public static function & getAll($tableName, $reload = false)
    {
        static $result = array();

        if($reload && !isset($result[$tableName]))
        {
            // query the database depending on $tableName,
            // and store the datas in $result[$tableName]
        }

        return $result[$tableName];
    }
}

class User extends AbstractModel
{
    public static function & getAll($reload = false)
    {
        $result = parent::getAll('users', $reload);
        return $result;
    }
}

class Group extends AbstractModel
{
    public static function & getAll($reload = false)
    {
        $result = parent::getAll('groups', $reload);
        return $result;
    }
}

これも機能しますか?改善できますか?

ご協力いただきありがとうございます :)

4

1 に答える 1

2

はい、できます。PHP5.0.0以降でサポートされています。

明確にするために、両方ともstaticキーワードを使用するPHPの2つの非常に異なるものを区別したいと思います。まず、クラス静的スコープです。これは、特にクラス全体に属します。2つ目は、変数の静的スコープです。これは、特に関数のローカルスコープに属します。

これはクラス静的スコープです(これはPHP> = 5.3.0でのみ使用可能です):

class Foo {
    public static $var;

    public static function GetVar() {
        return ++static::$var;
    }
}

var_dump(Foo::GetVar(),Foo::GetVar());

上記のコードはint(1) int(2)あなたが期待しているものをあなたに与えるでしょう。

これは可変静的スコープです(これはPHP> = 5.0.0で利用可能です):

class Foo {
    public static function GetVar() {
        static $var = 0;
        return ++$var;
    }
}

var_dump(Foo::GetVar(),Foo::GetVar());

上記のコードはまたint(1) int(2)あなたが期待しているものでもあるあなたを与えるでしょう。

1つは関数のローカルスコープに特に属し(その関数がクラスメンバーであっても)、もう1つは特にクラスに属していることに注意してください。

また、最初の例では、selfキーワードではなくstaticキーワードを使用したことに注意してください。これは、selfではLSBLate Static Binding )を実行できないためです。これは、親クラスを継承して呼び出すときに、特に関数のローカルスコープで静的変数ではなくクラス静的変数を使用する場合に考慮する必要がある可能性があります。

于 2012-12-06T00:35:16.610 に答える