1

$_SESSION私はオブジェクトを操作するのが好きなので、配列のラッパー クラスを持っています。これにより、怠け者になって、すべきではない場所からスーパー グローバルを呼び出すのを防ぐことができます。

以前は単純なもので問題ありませんでした:

public function get($name);
public function set($name, $value);
public function exists($name);
......

しかし今、私はショッピングサービスを実装しており、それにはショッピングカートがあり、ユーザーがカートにアイテムを追加すると$_SESSION['cart'][$productId]、数量を保持するように設定され、私のものを見て分解することができget()ますset().

私は現在、新しい get() 用にこれを持っています

/*
 * @args: ...
 * @return: mixed
 */
public function get() {

    $keys = func_get_args();
    $value = $_SESSION[array_shift($keys)];

    foreach( $keys as $key ) {
        $value = $value[$key];
    }

    return $value;
}

// This is how I use it then
$quantity = $session->get('cart', $productId);

検索対象のキーが存在すると完全に想定して動作しますが、存在しない場合は警告が表示されます。

問題は set() メソッドです。私は同様の方法でそれをやりたいので、メソッドの署名で任意の量のキーを指定してから、保存する値を指定できますが、とにかく私にとって非常に混乱することが証明されています.

これを達成する方法を知っている人はいますか?

ありがとう。

4

1 に答える 1

1

これはうまくいくはずです:

class Session{
    // $...
    public function get(){
        $keys = func_get_args();

        if(count($keys) < 1){
            // handle exception
        }

        $value = $_SESSION[array_shift($keys)];

        foreach($keys as $key){
            if(!isset($value[$key])){
                // handle exception
            }

            $value = $value[$key];
        }

        return $value;
    }

    // $valueToSet, $...
    public function set(){
        $data = func_get_args();

        if(count($data) < 2){
            // handle exception
        }

        $val = array_shift($data);

        $value = &$_SESSION[array_shift($data)];

        foreach($data as $key){
            if(!isset($value[$key])){
                $value[$key] = array();
            }

            $value = &$value[$key];
        }

        $value = $val;
    }

    // $...
    public function exists(){
        $keys = func_get_args();

        if(count($keys) < 1){
            // handle exception
        }

        $tmp = array_shift($keys);

        if(!isset($_SESSION[$tmp])) return false;
        $value = $_SESSION[$tmp];

        foreach($keys as $key){
            if(!isset($value[$key])){
                return false;
            }

            $value = $value[$key];
        }

        return true;
    }
}

少し例を挙げることができます:

$var = 'asdf';
$var_copy = $var;
$var_copy2 = &$var;

$var_copy = 'asdf2';
echo $var; // prints 'asdf'

$var_copy2 = 'asdf2';
echo $var; // prints 'asdf2'

そしてphp.netからの小さなリンク

于 2013-07-20T10:14:33.887 に答える