3

データベースからクエリを実行する機能があります。その後、他の 2 つの関数から呼び出されます。

function query(){
 $query= // get data from database;
return $query;
}

function show_something(){
$data = query();
//do something
}

function show_else(){
$data = query();
//do something else
}

関数 query() が 2 回呼び出されます。結果がキャッシュされない限り、関数が呼び出されるたびにクエリジョブを実行すると思います。私が間違っていたら、誰かが私を訂正してくれますか?

4

5 に答える 5

3

はい、2回呼び出されます。必要に応じて、静的変数を使用して結果をキャッシュできます。

于 2012-08-05T08:40:20.697 に答える
2

毎回同じクエリがプルされる (つまり、変数が変更されない) ことが予想される場合は、次の行に沿ってオブジェクトを使用することをお勧めします。

class checkSomethingOrOther
{
    public $myVariable;

    public function __get($name)
    {
        if (!array_key_exists($name, $this->myVariable))
        {
            $this->myVariable=query();
        }
        return $this-myVariable;
    }
}

これは、変数が設定されているかどうかを確認するだけで、設定されていない場合はデータを取得して返し、そうでない場合はそのまま返します。

于 2012-08-05T08:50:34.660 に答える
0

いいえ、それは正しいです。関数は無条件に明示的なクエリを実行するため、呼び出されるたびに実行されます。

于 2012-08-05T08:41:00.117 に答える
0

データベースは、関数呼び出しの間に変更された可能性があります。すぐに次々と呼ばれても。

したがって、はい、クエリは2回実行されます。結果が異なる場合があるためです。

何らかのキャッシュメカニズムを実装しない限り。

于 2012-08-05T08:41:41.570 に答える
0

あなたは単にこのようなことをすることができます:

  • クエリが最初であるか繰り返されるかをマークするインジケータを設定します。
  • 照会する前に、インジケーターを確認してください。

コード:

$fresh = true; // fresh results wanted
function query(){
global $fresh;
if($fresh){
     $query= // get data from database;
     $bar = $query; // cache the $query value for next uses..
     $$fresh = false; // set the indicator that query is cached.
}else{ // this is repeated query
    $query = $bar; //we had set the $bar last time
}
return $query;
}

function show_something(){
//first time query, $query will be fetched from database,
// also $fresh will be set to false
$data = query();
//do something
}

function show_else(){
//repeated query, cached value will be returned.
$data = query();
//do something else
}

$foo = true; // if you want fresh results, set $fresh to true before query
function show_fresh(){
//results will be fresh, because we have set $fresh to true again.
$data = query();
//do something else
}
于 2012-08-05T09:04:41.370 に答える