5

名前空間などを無視すると、静的配列への参照を返すことができない理由を誰かが説明できますか?事実上、クラスはゲッターとセッターです。アプリケーションのライフサイクル全体でクラスを再度インスタンス化する必要がないため、静的メソッドを使用したかったのです。

私がしていることは単に「悪い習慣」であるかもしれないことを理解しています-この問題についてのこれ以上の知識をいただければ幸いです。

namespace xtend\core\classes; 
use xtend\core\classes\exceptions;

class registry {

private static $global_registry = array();

private function __construct() {}

public static function add($key, $store) {
    if (!isset(self::$global_registry[$key])) {
        self::$global_registry[$key] = $store;
    } else {
        throw new exceptions\invalidParameterException(
            "Failed to add the registry. The key $key already exists."
        );
    }
}

public static function remove($key) {
    if (isset(self::$global_registry[$key])) {
        unset(self::$global_registry[$key]);
    } else {
        throw new exceptions\invalidParameterException(
            "Cannot remove key $key does not exist in the registry"
        );
    }
}

public static function &get($key) {
    if (isset(self::$global_registry[$key])) {
        $ref =& self::$global_registry[$key];
        return $ref;
    } else {
        throw new exceptions\invalidParameterException(
            "Cannot get key $key does not exist in the registry"
        );
    }
}

}

このように使う

$test = array("my","array");
\xtend\core\classes\registry::add("config",&$test);
$test2 =& \xtend\core\classes\registry::get("config");
$test2[0] = "notmy";    
print_r($test);

あなたは私が戻ってくると思います

array("notmy","array");

しかし、私は元の状態に戻るだけです。

4

3 に答える 3

1

エグゼクティブサマリー:

class Registry {
    private static $global_registry = array();

    public static function Add($key, &$value){
        static::$global_registry[$key] =& $value;
    }
    public static function &Get($key){
        return static::$global_registry[$key];
    }
    public static function Remove($key){
        unset(static::$global_registry[$key]);
    }
}

$test = array("my", "array");
Registry::Add("config", $test);
$test2 =& Registry::Get("config");
$test2[0] = "notmy";    
var_dump($test);

それがどのように機能するかを理解すれば、それは本当に非常に簡単です。

  • まず、関数add参照によって渡される必要があります。そうでない場合、関数に表示される値は、渡した値でさえありません。

  • 次に、値をに格納する場合、参照によって割り当てる$global_registry必要があります。それ以外の場合、格納される値は関数に表示される値でもありません。

  • 第三に、関数宣言にアンパサンドを入れて参照により戻る必要があります。このコードを除いて、あなたはすでにこれを行っています:

$ref =& self::$global_registry[$key]; // redundant line
return $ref;

このコードと同じです:

return self::$global_registry[$key];

public static function &getで、戻り値が参照であることをすでに宣言しているためです。

  • そして最後に、返された参照を参照によって割り当てる必要があります。これも実行しました。
$test2 =& Registry::Get("config");

ご覧のとおり、チェーン全体は参照によるものでなければなりません。ステップのいずれかが参照によって実行されない場合、それは機能しません。

于 2013-08-16T11:13:11.433 に答える
0

以下を参照することにより、静的配列を返すことができます。

$ref = &self::$global_registry[$key];

次のようにアクセスする必要があります。

$keyVal = &registry::get($key); 
于 2012-12-18T17:02:50.673 に答える
-1

次のコードを使用して、参照用のワークアウトを行うことができます

class Apple {

    public static $basket = [], $scripts =[];

    public static function addToBasket($grapes) {
        self::$scripts =& self::AppStatic(__CLASS__ . __METHOD__, array());
        self::$scripts[$grapes] = ['type' => $grapes];
        return self::$scripts;
    }

    public static function &AppStatic($name, $default_value = NULL) {
        if (isset(self::$basket[$name]) || array_key_exists($name, self::$basket)) {
            return self::$basket[$name];
        }

        if (isset($name)) {
            return self::$basket[$name] = &$default_value;
        }

        $data = NULL;
        foreach (self::$basket as $key => $value) {
            $data[$key] = $value;
        }
        return $data;
    }
}
于 2016-12-31T11:24:50.103 に答える