0

私は現在、ユーザーのログイン時にいくつかの定数を定義する既存のアプリケーションを使用しています。たとえば、アリスがログインする場合SOME_CONSTANTは、として定義され1、ボブがログインする場合SOME_CONSTANTはとして定義され2ます。今、私はそれがアリスであるかのようにいくつかのことをし、それがボブであるかのようにいくつかのことをするスクリプトを書こうとしています。「あたかもそうであるかのように」とは、SOME_CONSTANTある反復に対して1つの方法で定義され、次の反復に対して別の方法で定義されることを意味します。残念ながら、定数は値の切り替えに最適ではなく、アプリケーションをリファクタリングしてこれらを定数から変更することは、現時点ではオプションではありません。

私が検討した1つの方法は、pcntl_fork()を使用することでした。定数が定義される前にフォークして、定数ごとに個別のプロセスを実行しました。ただし、このスクリプトをLinuxだけでなくWindowsでも実行できるようにしたいと思います。現時点では、pcntl拡張機能はWindowsでは直接サポートされていません。そして、私がそれを助けることができれば、Cygwinを介してすべてが機能することを避けるように努めます。

私が検討したもう1つの方法は、スクリプトで.を使用して子スクリプトを呼び出すことexec("php childscript.php constant_value")でした。このメソッドでは、1つの子スクリプトで定数を定義し、別の子スクリプトで別の方法で定義できますか?すべきだと思いますが、まだテストしていません。また、この方法で誰かが見ることができる他の大きな問題はありますか?

私が考えていなかった別の方法がより良い選択になるでしょうか?お時間をいただきありがとうございます。

4

2 に答える 2

0

すでにお気づきのように、const変数を使用することは、タスクを処理するための実行可能な方法ではありません。さらに、複数のユーザーで何かを行うためにスクリプトを作成する必要がなかったとしても、この単一のインスタンスは機能しません。ユーザーがログインするときに「定数を設定」する必要がありますが、これはできません。行う。

疑似実装を探していて、readonlyOOPスタイルを使用している場合は、変数を追加して、 magic-methodprivateをオーバーライドできます。__getしたがって、外部からの要求がSOME_CONSTANTあると、クラスはの値を返します_someFakeConstant。次に、クラス内のlogin()またはswitchUser()メソッドで、値を安全に変更できます。

例:

class User {
    private $_someFakeConstant = -1;

    public function __get($name) {
        if ($name == 'SOME_CONSTANT') {
            return $this->_someFakeConstant;
        }
        // handle undefined variables; trigger_error() will work (see example on php.net)
    }

    public function login() {
        // logic to "identify" the user
        $this->_someFakeConstant = 1;
    }
}

$user = new User();
$user->login();
echo $user->SOME_CONSTANT;
于 2012-09-01T06:33:33.353 に答える
0

exec()PHPの子スクリプトを呼び出すために使用する方法は正常に機能しているようです。

于 2012-09-07T18:59:07.680 に答える