присвоение значений обектам класса
по идее все просто
но возникла небольшая загвоздка
у обекта есть какоето значение, по дэфолту
я хочу изменять это значение в случае если переменная $value установлена
тоесть примерно что-то потипу
var object = "значение по дэфолту";
}
$class = new S;
if (isset($value)){
$class->object = $value;
}
если не использовать условие то обекту присваивается(по идее) FALSE.
могу ошибаться, но это не столь значительно так как все равно идет присвоение и значение по дэфолту теряется
значит надо действовать другим методом, но у меня таких переменных может быть штук 50 и для каждого писать условие нехочится
межет есть какоето другое решение?
и заюзать магическую функцию
мне тоже приходила эта мысль и где мог я сделал проверку, но есто такая подлая штука называется "Smarty" настройки которой ставятся напримую без каких либо проверок
сколько не парю мозг ничего лучше придумать немогу
Сразу делай всем какое-то значение дефолтное, потом в методе будешь проверять на дефолтность
Сразу делай всем какое-то значение дефолтное, потом в методе будешь проверять на дефолтность
хм...
на слова оно хорошо, а на деле
у меня получается вот что:
# Configuration
var $conf = array( ... набор базовых конфигураций ... );
// Установить значение для конфигураций
function setConfig($name, $value){
// Проверку впринцыпе можно убрать
if (!isset($name)) return;
if (!isset($value)) return;
if (!is_string($name)) $this->error("Incompatible type of the data");
if (!is_string($value)) $this->error("Incompatible type of the data");
if (!is_numeric($value)) $this->error("Incompatible type of the data");
$this->conf[$name] = $value;
}
// Получить значение конфигураций
function getConfig($value1, $value2){
if (isset($value)){
return $value1;
} else {
return $this->conf[$value2];
}
}
}
# Content config
$content = new Content;
# Smarty config
$smarty = new Smarty();
$content->setConfig('smarty_compile_check', $smarty->compile_check);
$content->setConfig('smarty_debugging', $smarty->debugging);
$content->setConfig('smarty_template_dir', $smarty->template_dir);
$content->setConfig('smarty_compile_dir', $smarty->compile_dir);
$content->setConfig('smarty_config_dir', $smarty->config_dir);
$content->setConfig('smarty_cache_dir', $smarty->cache_dir);
$content->setConfig('smarty_left_delimiter', $smarty->left_delimiter);
$content->setConfig('smarty_right_delimiter', $smarty->right_delimiter);
$smarty->compile_check = getConfig($conf['smarty_compile_check'], 'smarty_compile_check');
$smarty->debugging = getConfig($conf['smarty_debugging'], 'smarty_debugging');
$smarty->template_dir = getConfig($conf['smarty_template_dir'], 'smarty_template_dir');
$smarty->compile_dir = getConfig($conf['smarty_compile_dir'], 'smarty_compile_dir');
$smarty->config_dir = getConfig($conf['smarty_config_dir'], 'smarty_config_dir');
$smarty->cache_dir = getConfig($conf['smarty_cache_dir'], 'smarty_cache_dir');
$smarty->left_delimiter = getConfig($conf['smarty_left_delimiter'], 'smarty_left_delimiter');
$smarty->right_delimiter = getConfig($conf['smarty_right_delimiter'], 'smarty_right_delimiter');
дикость какаято :confused: :eek:
Может пусть в классах и остаются. Только зря память занимать и голову
2UAS Мне кажется, что частично он прав, т.к. все настройки должны лежать в конфиге. Сейчас работаю с проектами, так там все конфиге в коде и в ооооочень диком массиве... Ужас тихий.
2dead_star Определись что ты хочешь. Если ты хочешь выносить всё в конфиг - выноси. Устонови дефолтовые значения в конфиге и юзай их.
Например:
{
public function __construct($configFileName)
{
$config = parse_ini_file($configFileName);
$this->setConfig($config);
}
private function setConfig(array $config)
{
$this->compile_dir = $config['compileDir'];
//И т.д.
}
}
//smarty.ini файл
[smarty]
compileDir = template_c
//и т.д.
Таким образом ты и код оставишь красивом и отделишь конфиги. По поводу пустых... У тебя они в конфиге уже будут, а если кто-то их будет стирать, так это его проблема. Если стереть всю программу, то она тоже не будет работать (даже алерта не выдаст) :)
по идее все просто
но возникла небольшая загвоздка
у обекта есть какоето значение, по дэфолту
я хочу изменять это значение в случае если переменная $value установлена
тоесть примерно что-то потипу
var object = "значение по дэфолту";
}
$class = new S;
if (isset($value)){
$class->object = $value;
}
если не использовать условие то обекту присваивается(по идее) FALSE.
могу ошибаться, но это не столь значительно так как все равно идет присвоение и значение по дэфолту теряется
значит надо действовать другим методом, но у меня таких переменных может быть штук 50 и для каждого писать условие нехочится
межет есть какоето другое решение?
гм, возможно я неправ, но есть такой шаблон проектирования Factory Method, alekciy уже упоминал о нем
более подробнее можно посмотреть здесь и по ссылкам
http://en.wikipedia.org/wiki/Factory_method
PS В конструкторе нужно вызывать конструктор предка, а я забыл :(
PSS Хотя немного подумав... Возможно, но мне такое решение почему-то не очень нравится, хотя alekсiy имел в виду совсем другое, он имел в виду простые гетеры и сетеры. (как мне кажется)
Например:
{
public function __construct($configFileName)
{
$config = parse_ini_file($configFileName);
$this->setConfig($config);
}
private function setConfig(array $config)
{
$this->compile_dir = $config['compileDir'];
//И т.д.
}
}
//smarty.ini файл
[smarty]
compileDir = template_c
//и т.д.
Таким образом ты и код оставишь красивом и отделишь конфиги. По поводу пустых... У тебя они в конфиге уже будут, а если кто-то их будет стирать, так это его проблема. Если стереть всю программу, то она тоже не будет работать (даже алерта не выдаст) :)
интересное решение. Спасибо за идею
но правдо мы сталкиваемся с тойже проблемой которая обсуждалась выше
$this->left_delimiter= $config['leftDelimiter'];
$this->right_delimiter= $config['rightDelimiter'];
все тоже самое. нет проверки.
если в логическом массиве $config осутствуе значение с индексом 'compileDir' то возникают некоторые проблемы
да в конфиге я всеравно пишу
; папка для компилированных шаблонов
compileDir = template_c
; левый делимер
leftDelimiter = <%
; правый делимер
rightDelimiter = %>
и я стремлюся к тому что при закоментировании строки в конфиге устанавливалось значение по умалчанию
например я хочу использовать правый и левый разделитель по умалчанию
; папка для компилированных шаблонов
compileDir = template_c
; левый делимер
;leftDelimiter = <%
; правый делимер
;rightDelimiter = %>
но в таком случае
функции isset($config['leftDelimiter']) и isset($config['rightDelimiter']) вернут FALSE и следующие строки неимеют смысла
$this->right_delimiter= $config['rightDelimiter'];
моя идея в том что бы вынести файл конфигураций и распарсивая получать массив различных конфигураций и передавать конфигурации программе, но перед присвоением проверять установленали выбранная дерректива если да то присвоить ее значение, если нет то использовать дэфолтное значение
тоесть мы как бы не устанавливаем конфигурации впринцыпе, а по желанию или необходимости изменяем уже существующие.
я могу ошибаться но помойму именно так должен работать конфиг
PS я понимаю что я разясняюсь недостаточно ясно, но может теперь моя идея будет ясна.
PSS Хотя немного подумав... Возможно, но мне такое решение почему-то не очень нравится, хотя alekсiy имел в виду совсем другое, он имел в виду простые гетеры и сетеры. (как мне кажется)
Гыыы... видимо что бы действительно казалось ты мне достаточно хорошо знаешь и "кажется" можно убрать из сообщения :D
Действительно, какие шаблоны проктирования, какая фабрика :) . По крайней мере не под данную задачу. Обычные геты и сеты.
моя идея в том что бы вынести файл конфигураций и распарсивая получать массив различных конфигураций и передавать конфигурации программе, но перед присвоением проверять установленали выбранная дерректива если да то присвоить ее значение, если нет то использовать дэфолтное значение.
А зачем тебе что либо проверять то? У тебя некая директива которая должна быть установлена в любом случае. Что дефолтное, что явно заданное переназначение, все равно какое-то значение должно быть установлено.
Загружай конфиг и задавай дефольные значения для свойств экземпляра класса. Где нужно просто переназначай эти свойства на нужные величины, ведь там, где ты собираешь потом использовать эти свойства уже все равно что записано в свойство, дефолтная виличина или переназначеная, главное что она есть.
Поэтому поддержу камрада shaelf. Если у тебя все же возникают трудност, то как мне думается проблема заключена не в возможностях проверки инициированных переменных, а в неправильном проектировании системы в целом.
согласен, но несовсем.
небывает неправильного проектирования
в моем случае я спроектировал задачу "передача конфигураций в программу" довольно ресурсоемко и при данной задаче нет необходимости затрачивать столько ресурсов. Поэтому моя реализация будет невыгодной, но это не значит что она неправельная. Эта реализация имеет ровно столько же прав на жизнь сколько имеет любая другая.
PS Всем большое спасибо за помощь. Вопросов больше не имею
согласен, но несовсем.
небывает неправильного проектирования
Ты не прав. Не бывает правильного проектирования, а вот неправильное бывает ;) .
Нельзя привести некий способ следуя которому ты получишь "правильный" код, но можно привести кучу методов как писать точно направильно. Процес то програмного проектирования недетерминированный.
Если критическим местом системы будет производительность, то реализация именно что будет неправильной. Если же критических моментов нет и система работает как этого требуется в ТЗ, то тогда и так сойдет. Но это совершенно не показатель правильности написания системы, это просто показатель возможной пригодности её в практике.
по совету alekciy убрал проверку данных
class Content extends Smarty {
// передача настроек конфига
function Content($file, $dir=""){
$file_config = _DocRoot_ . $dir . $file;
$compiled_config = _DocRoot_ . $dir . md5($file);
// $temporary_config = _DocRoot_ . $dir . "~" . md5($file);
if ((file_exists($compiled_config)) && (filemtime($file_config) < filemtime($compiled_config))){
require_once($compiled_config);
} else {/*
$config = file_get_contents($file_config); // считываем конфиг
$config = str_replace("#", ";", $config); // заменяем # на ;
$fp = fopen($temporary_config, "w"); // записываем конфиг во временный файл
fwrite($fp, $config);
fclose($fp);
$conf = parse_ini_file($temporary_config, true); // парсим конфиг
unlink($temporary_config); // удаляем временный конфиг
*/
$config_array = file($file_config); // считываем конфиг
$conf = $this->configParse($config_array); // парсим конфиг
}
// print_r($conf);
# Smarty config
$this->template_dir = $conf['smarty']['template_dir'];
// и т.д.
if ((isset($conf['system']['compiled'])) && ($conf['system']['compiled'] == 1)){
$this->configCompiled($compiled_config); // компилируем конфиг
}
}
// парсер конфига
function configParse($config = array()){
$section = "";
foreach ($config as $str){
$s = str_replace(" ", "", rtrim($str));
if ((substr($s, 0, 1) == "[")){
list($section, ) = explode("]", substr($str, 1), 2);
} elseif ((substr($s, 0, 1) != "#") && ($s != "")){
$str = str_replace("true", 1, $str); // замещаем Булевы
$str = str_replace("false", 0, $str);
$str = rtrim($str);
list($construction, $value) = explode("=", $str, 2);
$construction = str_replace(" ", "", $construction);
// обризаем лишнее в начале строки
$i = 1;
$v = substr($value, $i, 1);
while (($v == " ") || ($v == "\"") || ($v == "'")){
$i++;
$v = substr($value, $i, 1);
}
$value = substr($value, $i); // обризаем
// обризаем лишнее в конце строки
$i = 1;
$v = substr($value, -$i);
while (($v == " ") || ($v == "\"") || ($v == "'")){
$i++;
$v = substr($value, -$i);
}
$value = substr($value, 0, strlen($value)-$i+1); // обризаем
// массив значений
$conf[$section][$construction] = $value;
}
}
return $conf;
}
// компилятор конфига
function configCompiled($file){
$array = "";
# Smarty config
$array .= "$" . "conf['smarty']['template_dir'] = \"" . $this->template_dir . "\";\n";
// и т.д.
$compiled = "<?php\n".$array."?>";
// запись скомпилированного конфига
$fp = fopen($file, "w");
fwrite($fp, $compiled);
fclose($fp);
}
}
?>
и соответсвенно вызов
мне понравилась работа функции parse_ini_file() которую посоветовал shaelf
единственное "но" - конфиг должен быть оформлен по стандарту php.ini, а в нем используется ";"
мне больше нравится использовать "#" поэтому я немножко заморочился
если заменить эти две строчки
$conf = $this->configParse($config_array); // парсим конфиг
на эти
$config = file_get_contents($file_config); // считываем конфиг
$config = str_replace("#", ";", $config); // заменяем # на ;
$fp = fopen($temporary_config, "w"); // записываем конфиг во временный файл
fwrite($fp, $config);
fclose($fp);
$conf = parse_ini_file($temporary_config, true); // парсим конфиг
unlink($temporary_config); // удаляем временный конфиг
то возможно парсинг будет затрачивать меньше ресурсов(здесь у меня вопрос к знатокам)
если плюнуть на савои нехачу и использовать стандарт php.ini
то можно ограничится одной сторкой и сэкономить куча ресурсов
вообще конфиг компилится так что большой необходимости в экономии нет
Задача. Нужно сделать несколько объектов на одной странички с заранее установлеными данными. Пример ученик школы, 1 класс. Делаем фабрику, в которой присваиваем в классе Человек (или ребёнок, не суть) возраст -7 лет и плодим на страничке как кроликов.
Почему он не пригоден для данной ситуации? Просто тут нужен всего 1 объект вида (смарти). Я бы вообще пошёл наверное дальше и сделал его синглтоном.
2dead_star
>>небывает неправильного проектирования
Ты даже представить себе не можешь, как ты ошибаешься...
мне понравилась работа функции parse_ini_file() которую посоветовал shaelf
единственное "но" - конфиг должен быть оформлен по стандарту php.ini, а в нем используется ";"
В чем проблема, не нравиться стандартные средсва напиши свой класса загрузки параметров конфигрурации. Лично я так и сделал.