Какая максимальная вложенность конфиг файла, с которой может работать компонент Config?
<?php
$GLOBALS['config'] = [
'mysql' => [
'host' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'test'
]
];
class Config {
public static function get($path = null) {
if($path) {
$config = $GLOBALS['config'];
$path = explode('.' , $path);
foreach ($path as $item) {
if (isset($config[$item])) {
$config = $config[$item];
}
}
return $config;
}
return false;
}
}
Какая максимальная вложенность конфиг файла, с которой может работать компонент Config? В книге был такой вопрос. Но я не понял суть вопроса?
Ответы (1 шт):
Но я не понял суть вопроса? Здесь о говорится о том, что когда вы используете статичный метод
$user_name = Config::get('mysql.username');
Вас спрашивают до какой глубины вложенности элементов может достучаться Config::get() или другими словами сколько точек можно указать в значении аргумента функции в качестве разделителя уровней вложенности.
Ответом на этот вопрос - сколь угодно, потому как циклом мы проходимся массиву (в нашем примере это ['mysql','username']) и обращаемся сперва к $GLOBALS['config']['mysql'] , а на второй итерации цикла - обращаемся к $GLOBALS['config']['mysql']['username'].
Этот пример является надуманным и по факту является говнокодом, так как в метод встроена глобальная переменная, а значит есть способ перезатереть её значения.
Что бы не перезатерать настройки - не используют глобальные переменные, а используют глобальные константы. Что бы код был гибким - глобальные константы не зашивают внутри методов, а передают в качестве аргументов. Пример:
<?php
//Enter your code here, enjoy!
define("CONFIG", [
'mysql' => [
'host' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'test'
]
]);
class Config {
public static function get($path = null , $config)
{
if($path) {
$path = explode('.' , $path);
foreach ($path as $item) {
if (isset($config[$item])) {
$config = $config[$item];
}
}
return $config;
}
eror_log('invalid request');
}
}
echo Config::get('mysql.host',CONFIG);
Опять же на лицо неразумное использование ресурсов компьютера - так как пример не имеет отношения к реальности. Эффективнее всего напрямую обращаться к элемену:
echo CONFIG['mysql']['username'];
Также хочу обратить ваше внимание на то что в примере не указана строгая типизация - функция должна возвращать один тип данных. В данном случае статический метод может отдавать массив(если указано неверно имя свойства), строку (если указано все верно) и булев тип false если не указан первый аргумент.
По этой причине не рекомендую изучать Вами данную книгу. Читать говнокод не зная этого плохая практика обучения.
Эта функция заменяется выражением
$user_name = CONFIG['mysql']['username']??null;