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

是的,你可以这么做。从 PHP 5.0.0 开始支持它。

为了澄清,我想区分 PHP 中两个非常不同的东西,它们都使用 static 关键字。首先是类静态作用域,它专门属于整个类。二是变量 static scope,具体属于函数的局部作用域。

这是类静态范围(仅在 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)这也是你所期望的。

请注意,一个专门属于函数的本地范围(即使该函数是类成员),另一个专门属于该类。

另请注意,我在第一个示例中使用了static关键字而不是self关键字,因为 self 不允许您执行LSB后期静态绑定)。这可能是您在继承然后调用父类时需要考虑的事情,特别是如果您要在函数的局部范围内使用类静态变量而不是静态变量。

于 2012-12-06T00:35:16.610 回答