7

私はいくつかのサイトで使用しているプログラムを持っています。require('config.php');を使用します。mysql接続情報、パスなどのサイト依存変数を設定します。

$ backup_pathのように、これらのサイト依存変数の1つを関数で使用するとします。

この変数は最初にconfig.phpで宣言されており、メインプログラムファイルには表示されません。

関数makebackup($ table_name);でこの変数にアクセスする必要があります。(別のfunctions.phpファイルにもあります)。

言う方がいいですか

makebackup('my_table');

次に、関数内で「global $ backup_path」を使用します。または、を使用して関数を呼び出す方がよいでしょう。

makebackup('my_table'、$ backup_path);

最初の議論は、メインプログラムのフローを煩雑にすることなくシンプルで理解しやすいものに保つというものです。

2番目の議論は、変数$ backup_pathがしばらく経過した後に存在することは明らかではない可能性があり、デバッグまたはやり直しが困難になる可能性があるというものです。

これらのテクニックのどちらかがプロのプログラマーの間で「標準」ですか?または、$ _ SESSIONを使用してこれらのグローバル変数を宣言する必要がありますか?

4

7 に答える 7

5

第二の選択肢、

makebackup('my_table', $backup_path);

再利用可能な関数であるため、一般的に推奨されます。追加の引数は、再利用性にとって大きな代償ではありません。

その特定のアプリケーションでのみ、かつ $backup_path のみでその関数を使用することが完全に確実である場合は、おそらくグローバルな代替手段を検討してください。その場合でも、グローバル変数が実際に存在することを確認することをお勧めします。また、いったんグローバルを使い始めると、それを取り除くのは非常に難しいことに注意してください。

于 2009-09-18T09:29:59.323 に答える
1

関数のデフォルト値を設定できることを忘れないでください。

function makebackup($table, $dir = CONFIG_BACKUP_PATH)

そうすれば、デフォルトの場合に変数を指定する必要がなくなり、構成されたバックアップパスがデフォルトであると単純に想定できます。

これは、グローバル変数ではなく定数を使用していることを前提としています。

于 2009-09-18T09:58:17.363 に答える
1

そのグローバル変数にラベルを付ける

個人的には、グローバル変数を非常に明確にマークすることにも取り組んでいます。それらを使用する必要がある場合は、それらについて明確にしたいと思います。

ここでは、名前をに変更$backup_path$GLOBAL_backup_pathます。私はそれを見るたびに、それに注意することを知っているでしょう。

于 2009-09-18T10:01:12.803 に答える
1

この目的には、Factory クラス構成のシングルトンを使用する必要があると思います。

関数 makebackup($table)
{
   $backup_path = ConfigFactory().getConfig($some_site_specific_data).getBackupPath()
   mysqldump($table, $backup_path)
}
于 2009-09-18T09:23:34.097 に答える
1

参照を渡す方がはるかに簡単にテストできます (モック構成オブジェクトを指定できます)。グローバルはそうではありません。メソッドで参照が null ではないことをアサートできます。私はテスト容易性のベストプラクティスと呼んでいます。

于 2009-09-18T09:29:35.247 に答える
1

別のオプションは、define() で php 定数を使用することです。

config.php は、すべてのパラメーター (mysql 接続、css スタイルなど) の定数を設定します。その後、変数を関数に渡したり、グローバルを使用したりする必要はありません。

欠点の 1 つは、ブール値、浮動小数点数、文字列、または整数のみを定義でき、複雑なデータ構造を定義できないことです。

于 2009-09-18T10:40:14.877 に答える
0

本当に「正しい」方法があるかどうかはわかりませんが、別のオプションは次のようになります。

function makebackup($table, $backup_path = '') {
    if ( $backup_path == '' ) {
        if ( isset($GLOBALS['backup_path']) ) {
            $backup_path = $GLOBALS['backup_path'];
        }
        else {
            die('No backup path provided');
        }
    }
 }

そうすれば、(テストおよび将来の使用のために) 値を渡すことができます。または、値を渡さない場合、関数は可能なグローバル変数を探します。

于 2009-09-18T10:06:56.177 に答える