0
class Constants
{
        public static $url1      = "http=//url1";
        public static $url2       = Constants::$url1."/abc2";
        public static $url3       = Constants::$url1."/abc3";
        public static $url4       = Constants::$url1."/abc4";
}

私はこれが不可能であることを知っています

$url1 定義を 1 か所で使用するように使用する必要があります

class urlOnly
{
      public static $url1      = "http=//url1";
}
class Constants
{
        public static $url1       = urlOnly::$url1;
        public static $url2       = urlOnly::$url1."/abc2";
        public static $url3       = urlOnly::$url1."/abc3";
        public static $url4       = urlOnly::$url1."/abc4";
}

また、このように使用したい場合、クラス「urlOnly」にクラス「定数」のみがアクセスできるようにすることはできますか。

このソリューションでは2つのクラスを作成する必要があるため、代替ソリューションは大歓迎です。また、関数としてではなく、変数としてのみ変数にアクセスしたいのですが、これは static のようにアクセスしたいです

4

3 に答える 3

1

クラス定義で非スカラー値を使用することはできません。define()代わりに使用してください。

于 2013-04-12T04:45:47.063 に答える
0

一般に、クラス メソッドを呼び出さずに定数と静的プロパティを動的に宣言する方法はありません。ただし、必要なロジックを実装できます。文字列定数ではプレースホルダーを使用する必要があります。次に、定数を取得してプレースホルダーを置き換えるための静的メソッド「get」を追加する必要があります。このような:

class Constants
{
    protected static $config = array(
        'url1' => 'http=//url1',
        'url2' => '%url1%/abc2',
        'url3' => '%url1%/abc3',
        'url4' => '%url1%/abc4',
    );

    public static function get($name, $default = null)
    {
        if (!empty(self::$config[$name]) && is_string(self::$config[$name]) && preg_match('/%(\w[\w\d]+)%/', self::$config[$name], $matches)) {
            self::$config[$name] = str_replace($matches[0], self::$config[$matches[1]], self::$config[$name]);
        }
        return self::$config[$name];
    }
}

使い方:

Constants::get('url1');
Constants::get('url2');
Constants::get('url3');
Constants::get('url4');
于 2013-04-12T06:38:35.203 に答える
0

あなたが探しているものを達成するためにできることの1つはこれです:

class Constants {
    public static $url1 = "http://url1";
    public static $url2 = "";
    // etc
}

Constants::$url2 = Constants::$url1 . "/abc2";

残念ながら、静的変数はリテラルまたは変数でしか初期化できないため、静的値を動的に定義するには、クラスのコンテキストの外で行う必要があります(したがって、この回答の以前のバージョンには解析エラーがありました)。

ただし、defineその目的は定数値を定義することであり、クラスのコンテキスト内に定数を格納する理由がないため、代わりに を使用することをお勧めします (少なくとも私の意見では)。

何かのようなもの:

define("URL1", "http:://url1");
define("URL2", URL1 . "/abc2");

次に、クラス アクセサーを指定する必要はなく、必要に応じてURL1orURL2を使用するだけです。

于 2013-04-12T04:42:08.663 に答える