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» можно получить доступ только по классу «Константы».
Альтернативное решение наиболее приветствуется, так как в этом решении мне нужно создать два класса. Также я хочу получить доступ к переменной только как переменную, а не как функцию, и я хочу, чтобы к ней обращались как статические
Вы не можете использовать нескалярные значения в определении класса. Вместо этого используйте 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');