php - 学習 - webプログラミング 入門



PHPウェブアプリケーションで設定変数を保存する最良の方法は何ですか? (8)

私はしばしば.NETとPHPの開発を切り替えます。 ASP.NETサイトでは、適切に保護され、値にアクセスしやすいweb.configファイルに設定情報(接続文字列、ディレクトリ、アプリケーション設定など)を保存します。

PHPでは 、各変数の静的メソッド持つクラスでこれを解決します。

class webconfig {
    public static function defaultPageIdCode() {
        return 'welcome';
    }
}

ファイルはapp変数に含まれており、1行でアクセスします:

$dp = webconfig::defaultPageIdCode();

PHPはコンパイルされていないので、 telnetでWebサイトの値を変更するのは簡単です。このソリューションはかなりうまく動作し 、次の2つの利点があります。

  • 私は、アプリケーションとのインタフェースを壊さずに、コンフィグ変数にロジック追加することができます
  • これらの設定変数は、私のEclipse、NetBeansなどでintellisenseとして表示されます。

しかし、他の利点があるかもしれないPHPでWeb設定を保存して解決する方法は他にもあると思います。

特に多くのPHPフレームワークを経験している人、設定変数とその長所と短所を保存する他の方法は何ですか?


Answer #1

PHPで私はいつも ".htaccess"を使って自分の設定ファイルを保護しています(二重保護)


Answer #2

PHPはOOを使うことができるので、私は "Configクラス"を使いたいと思っています:

class Config
{
    /**
     * ---------------------------------
     * Database - Access
     * --------------------------------- 
     */

    /**
     * @var String
     */
    const DB_DRIVER = 'pgsql';

    const DB_USER = 'postgres';

    const DB_PASSWORD = 'postgres';

    const DB_NAME = 'postgres';
}

Config :: DB_DRIVERで簡単にアクセスできます。 アプリケーションオートローダーがそれを行うので、ファイルを含める必要はありません。 もちろん、ファイルを保護する必要があります。


Answer #3

注:「最良の方法」は存在しません。 すべてのアプリケーションとフレームワークは独自のスタイルを採用しています。 あなたの例がトリックをやっている間、私はそれが単純な設定ファイルのための少しリソース重いと思う。

  • あなたは、Amberが指摘したような単一の変数でそれを行うことができます
  • これは最も一般的なアプローチであり、いつでも簡単に設定ファイルを編集することができます。
  • PHPが簡単に解析できる .iniファイルを使って実行できます

編集:

Edward parse_ini_fileの例を見てください。 簡単なコマンドで.iniファイルを読み込み、次に例のようにクラス内の変数を使用できます。


Answer #4

いくつかの可能性があります:

  1. 設定ファイル(ini、json、xml、yaml)を使うことができます。 iniの場合はparse_ini_file 、JSONの場合はjson_decode (+ json_decode )、YAMLの場合は外部ライブラリ(sfYamlの検索)を使用する必要があります。

  2. あなたはあなたのスクリプトに含まれている変数または定数を持つ設定ファイルを持つことができます(不変設定の方が良く、すべてのスコープでアクセス可能です):

    define( 'ROOT_DIR'、 '\ home \ www');

    $ sRootDir = '\ home \ www';

オブジェクト指向の場合は、プロパティとしてクラスにラップすることができます。すべてのプロパティに対してgetterメソッドがない場合は、次のようにすることができます。

class Config
{
    public $var1 = 'xxx';
    public $var2 = 'yyy';
}

($ c =新しいConfig(); print $ c-> var1)

または

static class Config
{
    public static $var1 = 'xxx';
    public static $var2 = 'yyy';
}

(print c :: $ var1)

レジストリ型のクラスを持ち、シングルトンパターンを実装し、与えられたファイルからconfigを読み込むことができるのが最善です。


Answer #5

私がそれを行う方法は、それらを直接array格納し、ファイルをconfig.phpとして保存することです

<?php

$config['dbname'] = "mydatabase";
$config['WebsiteName'] = "Fundoo Site";
$config['credits'] = true;
$config['version'] = "4.0.4";

?>

Thiは、WordpressなどのようなほとんどのPHPフレームワークがそれを行う方法です。


Answer #6

私は、PHPでSettings静的クラスを使用する傾向があります。これは、

  • それはグローバルスコープを持っています。
  • 保護された設定の変更を有効/無効にすることができます。
  • 実行時に任意の設定を追加できます。
  • クラスを自動化して、ファイル/データベースからパブリックコンフィグを取得することができます。

例:

abstract class Settings
{
    static private $protected = array(); // For DB / passwords etc
    static private $public = array(); // For all public strings such as meta stuff for site

    public static function getProtected($key)
    {
        return isset(self::$protected[$key]) ? self::$protected[$key] : false;
    }

    public static function getPublic($key)
    {
        return isset(self::$public[$key]) ? self::$public[$key] : false;
    }

    public static function setProtected($key,$value)
    {
        self::$protected[$key] = $value;
    }

    public static function setPublic($key,$value)
    {
        self::$public[$key] = $value;
    }

    public function __get($key)
    {//$this->key // returns public->key
        return isset(self::$public[$key]) ? self::$public[$key] : false;
    }

    public function __isset($key)
    {
        return isset(self::$public[$key]);
    }
}

あなたのランタイムの中で、このファイルを最初にロードし、その後にデータベース設定ファイルをロードした場合、データベース設定ファイルは次のようになります:

<?php
Settings::setProtected('db_hostname', 'localhost');
Settings::setProtected('db_username', 'root');
Settings::setProtected('db_password', '');
Settings::setProtected('db_database', 'root');
Settings::setProtected('db_charset', 'UTF-8');
//...
echo Settings::getProtected('db_hostname'); // localhost
//...
Settings::setPublic('config_site_title', 'MySiteTitle');
Settings::setPublic('config_site_charset', 'UTF-8');
Settings::setPublic('config_site_root', 'http://localhost/dev/');

あなたが見ることができるように、私たちには__getというメソッドがあります。このメソッドはパブリック変数を取得することしか許されません。なぜこれがあるのか​​の例は次のとおりです:

$template = new Template();
$template->assign('settings', new Settings());

このオブジェクトを静的オブジェクトとして使用していたにもかかわらず、値はまだテンプレート内にあるはずです。

<html>
    <head>
        <?php echo isset($settings->config_site_title) ? $settings->config_site_title : 'Fallback Title'; ?>
    </head>
</html>

これにより、初期化された期間に公開データにアクセスできるようになります。

これははるかに複雑ですが、よりシステムフレンドリーな、いくつかの例を得ることができます:

  • 設定ファイルxml、php、yamlを自動的に解析するloadConfigメソッド。
  • shutdown_functionを登録すると、新しい設定でデータベースを自動更新できます。
  • そのデータベースのconfigを使用してクラスを自動入力できます。
  • イテレーターを実装して、ループと互換性を持たせることができます。
  • さらに多く。

これも私がこの仕事を完了するための最良の方法です。


Answer #7

考えられる可能性はほとんどありますが、最も一般的な方法は、.csv、.ini、.xmlなどのファイルにプレーンテキストとして保存することです。 小さなトリックでこれらのファイルを保護することができるので、誰もファイルを直接ロードすることはできません。

INIファイルの例:

;<?php die(); ?>
[config1]
var1 = 'value1';
var2 = 'value2';
...
[config2]
...

; iniファイル内のコメントとみなされます。 したがって、ini-parserでファイルを読み込むと、この行は無視されます。 誰かがURL経由でファイルに直接アクセスすると、 die()関数が実行されます。 これは、INIファイルが.phpのようなファイル拡張子を持っていて、サーバが実行され、プレーンテキストとして表示されないことが分かっている場合にのみ有効です。

ほとんどのfile-base-config-storageの欠点はutf8文字の問題です。

Zend_ConfigはZend-Frameworkのコンポーネントで、いくつかのストレージアダプタに使いやすいapiを提供します。


Answer #8

通常の方法はdefineを使うことです:

define('MYSQL_USER', 'ROOT');

MYSQL_USERを介してアプリケーション全体にアクセスします。

$user = MYSQL_USER;

しかし、配列はこのようにサポートされていません。





configuration