Константы var внутри класса класса

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 на одном месте

 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» можно получить доступ только по классу «Константы».

Альтернативное решение наиболее приветствуется, так как в этом решении мне нужно создать два класса. Также я хочу получить доступ к переменной только как переменную, а не как функцию, и я хочу, чтобы к ней обращались как статические

Related of "Константы var внутри класса класса"

Вы не можете использовать нескалярные значения в определении класса. Вместо этого используйте define() .

Одно, что вы можете сделать для достижения того, что вы ищете, это:

 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"); 

Тогда вам не нужно указывать аксессуар класса, просто используйте URL1 или URL2 мере необходимости.

Как правило, нет возможности объявлять константы динамической и статические свойства без вызова методов класса. Но вы можете реализовать логику, которая вам нужна. Вы должны использовать заполнители в константах strirngs. Затем вы должны добавить статический метод «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');