3

元の変数を参照で上書きすると内部的にどうなりますか?
つまり、これは悪いことであり、余分な時間やリソースがかかるのでしょうか?

<?php
function db(){
    global $db;
    if( empty($db)) $db = new PDO('sqlite:/tmp/default.db3');
    return &$db;
}

$db = db();
?>
4

4 に答える 4

3

使用する場合

global $db;

これにより、グローバル変数$dbがローカル スコープにインポートされます。

次に、別の変数 (グローバル変数を表す) として存在します。最後に、その変数への参照を返そうとします。

return &$db;

ただし、これは参照によるリターンではありません。代わりに、値を返すだけです。

次に、グローバル変数テーブルに$db独自の値を上書きします。ここで起こっていることはそれだけです。

余分な時間やリソースが必要ですか?

余計なことをすると、余分な時間やリソースが必要になります。ただし、PHP にはコピー オン ライト (COW) と呼ばれる最適化機能があるため、通常はあまり気にする必要はありません。PHP は負担を軽減するのに非常に適しています。

コード内のオブジェクトに関する限り。このように変更するだけです:

<?php

$db = new PDO('sqlite:/tmp/default.db3');

?>

次に、必要な場所に db オブジェクトを渡します。シンプルにしろよバカ。

于 2012-08-06T12:42:59.803 に答える
0

オブジェクトよりも常に小さいオブジェクトのアドレスを返すため、これ以上リソースを消費するべきではありません。

確かに、PHP 5 でオブジェクトが返される場合、オブジェクトの前に (&) を付けなくても参照によって返されます。(修正されたオブジェクトは参照によって返されません):

http://php.net/manual/en/language.references.return.php

私は、他のすべてのプログラミング言語から、オブジェクトが参照によって渡されたり返されたりすること、およびネイティブデータ型がコピーによって返されることを知っています。

グローバル変数を使用した例では、関数の外部で変数を参照しています。すでにオーバーライドしているため、戻り値は必要ありません。

于 2012-08-06T12:38:45.363 に答える
0

元の例は構文エラーであるため、これがあなたが書きたかったものだと思います:

function db(){
    static $db = null;
    if ($db === null) {
        $db = new PDO('sqlite:/tmp/default.db3');
    }
    return $db;
}

本当にその傾向がある場合は、スクリプトをvulcan ロジック 逆アセンブラーで実行して、オペコードを取得できます。唯一の注目すべき違いは、参照を含むバージョンでは、RETURN と ASSIGN の代わりに RETURN_BY_REF と ASSIGN_REF オペコードを使用することです。それらが実行されたときにエンジンが何をするかを判断するのは簡単ではありませんが、主にコピーオンライトの動作により、通常はコピーが妨げられます。

于 2012-08-06T14:33:46.363 に答える
0

これは、参照によって返す方法ではありません。次のように関数を宣言する必要があります。

function &return_by_ref()
{
    $something="";
    return $something;
}

参照によってオブジェクトを返す必要はありません。言語では、すべてのオブジェクトが参照によって自動的に返されるように指定されています。また、マニュアルでは、オブジェクトに対して参照演算子を使用しないことを強く推奨しています。

これはあなたが実際に意味することですか:

class DB{
   private function __construct(){}
   public static $db=null;
}

function db($db)
{
   if(!isset(DB::$db))
      DB::$db=new PDO('sqlite:/tmp/default.db3');
   return DB::$db;
}

使用法:

function create_user()
{
   db()->exec("INSERT INTO `users` SET `name`='John Doe'");
   return db()->lastInsertId();
}

function get_users()
{
   return db()
      ->query("SELECT * FROM `users`")
      ->fetchAll(PDO::FETCH_ASSOC)
   ;
}
于 2012-08-06T12:52:07.370 に答える