Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

присвоение значений обектам класса

312
01 ноября 2007 года
dead_star
392 / / 26.11.2006
проблема с присвоением

по идее все просто
 
Код:
$class->object = $value;

но возникла небольшая загвоздка
у обекта есть какоето значение, по дэфолту
я хочу изменять это значение в случае если переменная $value установлена
тоесть примерно что-то потипу
 
Код:
class S {
 var object = "значение по дэфолту";
}
$class = new S;
if (isset($value)){
 $class->object = $value;
}

если не использовать условие то обекту присваивается(по идее) FALSE.
могу ошибаться, но это не столь значительно так как все равно идет присвоение и значение по дэфолту теряется

значит надо действовать другим методом, но у меня таких переменных может быть штук 50 и для каждого писать условие нехочится

межет есть какоето другое решение?
251
01 ноября 2007 года
SkyMаn
1.7K / / 31.07.2007
попробуй вместо [COLOR=#0000bb]$class [COLOR=black]использовать[/COLOR] $[/COLOR][COLOR=black]this[/COLOR]
и заюзать магическую функцию
12
01 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Ну и делай установку свойст объекта не напрямую, а через некий метод, который как раз проверкой и займется.
312
01 ноября 2007 года
dead_star
392 / / 26.11.2006
Цитата: alekciy
Ну и делай установку свойст объекта не напрямую, а через некий метод, который как раз проверкой и займется.



мне тоже приходила эта мысль и где мог я сделал проверку, но есто такая подлая штука называется "Smarty" настройки которой ставятся напримую без каких либо проверок

сколько не парю мозг ничего лучше придумать немогу

 
Код:
if (isset($conf['smarty_template_dir'])) $smarty->template_dir = $conf['smarty_template_dir'];
244
01 ноября 2007 года
UAS
2.0K / / 19.07.2006
ИМХО изврат проверять на существование перменные таким образом.
Сразу делай всем какое-то значение дефолтное, потом в методе будешь проверять на дефолтность
312
01 ноября 2007 года
dead_star
392 / / 26.11.2006
Цитата: UAS
ИМХО изврат проверять на существование перменные таким образом.
Сразу делай всем какое-то значение дефолтное, потом в методе будешь проверять на дефолтность



хм...
на слова оно хорошо, а на деле

у меня получается вот что:

Код:
class Content {
 # 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:
244
01 ноября 2007 года
UAS
2.0K / / 19.07.2006
Дикость ещё та) Только вот смысл всего этого в конифг пихать?)
Может пусть в классах и остаются. Только зря память занимать и голову
15
02 ноября 2007 года
shaelf
2.7K / / 04.05.2005
2SkyM@n За пределами класса $this довольно неординарно себя ведёт:)
2UAS Мне кажется, что частично он прав, т.к. все настройки должны лежать в конфиге. Сейчас работаю с проектами, так там все конфиге в коде и в ооооочень диком массиве... Ужас тихий.
2dead_star Определись что ты хочешь. Если ты хочешь выносить всё в конфиг - выноси. Устонови дефолтовые значения в конфиге и юзай их.
Например:
Код:
class Content extends Smarty
{
    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
//и т.д.

Таким образом ты и код оставишь красивом и отделишь конфиги. По поводу пустых... У тебя они в конфиге уже будут, а если кто-то их будет стирать, так это его проблема. Если стереть всю программу, то она тоже не будет работать (даже алерта не выдаст) :)
300
02 ноября 2007 года
ReDrum
689 / / 20.04.2000
Цитата: dead_star
проблема с присвоением

по идее все просто
 
Код:
$class->object = $value;

но возникла небольшая загвоздка
у обекта есть какоето значение, по дэфолту
я хочу изменять это значение в случае если переменная $value установлена
тоесть примерно что-то потипу
 
Код:
class S {
 var object = "значение по дэфолту";
}
$class = new S;
if (isset($value)){
 $class->object = $value;
}

если не использовать условие то обекту присваивается(по идее) FALSE.
могу ошибаться, но это не столь значительно так как все равно идет присвоение и значение по дэфолту теряется

значит надо действовать другим методом, но у меня таких переменных может быть штук 50 и для каждого писать условие нехочится

межет есть какоето другое решение?



гм, возможно я неправ, но есть такой шаблон проектирования Factory Method, alekciy уже упоминал о нем
более подробнее можно посмотреть здесь и по ссылкам
http://en.wikipedia.org/wiki/Factory_method

15
02 ноября 2007 года
shaelf
2.7K / / 04.05.2005
Factory тут не при чём. Он нужен для того, чтобы создавать экземпляры класса. В данном случае необходимо просто прозрачно устанавливать значения из шаблонов и всё. Т.е. наследуем смарти (в данном случае) и приватным методом устанавливаем ему параметры, которые и берём из конфиг файла.
PS В конструкторе нужно вызывать конструктор предка, а я забыл :(
PSS Хотя немного подумав... Возможно, но мне такое решение почему-то не очень нравится, хотя alekсiy имел в виду совсем другое, он имел в виду простые гетеры и сетеры. (как мне кажется)
312
02 ноября 2007 года
dead_star
392 / / 26.11.2006
Цитата: shaelf
2dead_star Определись что ты хочешь. Если ты хочешь выносить всё в конфиг - выноси. Устонови дефолтовые значения в конфиге и юзай их.
Например:
Код:
class Content extends Smarty
{
    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->compile_dir = $config['compileDir'];
$this->left_delimiter= $config['leftDelimiter'];
$this->right_delimiter= $config['rightDelimiter'];

все тоже самое. нет проверки.
если в логическом массиве $config осутствуе значение с индексом 'compileDir' то возникают некоторые проблемы

да в конфиге я всеравно пишу
 
Код:
[smarty]
; папка для компилированных шаблонов
compileDir = template_c
; левый делимер
leftDelimiter = <%
; правый делимер
rightDelimiter = %>


и я стремлюся к тому что при закоментировании строки в конфиге устанавливалось значение по умалчанию
например я хочу использовать правый и левый разделитель по умалчанию

 
Код:
[smarty]
; папка для компилированных шаблонов
compileDir = template_c
; левый делимер
;leftDelimiter = <%
; правый делимер
;rightDelimiter = %>

но в таком случае
функции isset($config['leftDelimiter']) и isset($config['rightDelimiter']) вернут FALSE и следующие строки неимеют смысла
 
Код:
$this->left_delimiter= $config['leftDelimiter'];
$this->right_delimiter= $config['rightDelimiter'];


моя идея в том что бы вынести файл конфигураций и распарсивая получать массив различных конфигураций и передавать конфигурации программе, но перед присвоением проверять установленали выбранная дерректива если да то присвоить ее значение, если нет то использовать дэфолтное значение

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

PS я понимаю что я разясняюсь недостаточно ясно, но может теперь моя идея будет ясна.
312
02 ноября 2007 года
dead_star
392 / / 26.11.2006
хотя может действительно стоит забить на этот дэфлт и присваивать прямтак
12
02 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: shaelf

PSS Хотя немного подумав... Возможно, но мне такое решение почему-то не очень нравится, хотя alekсiy имел в виду совсем другое, он имел в виду простые гетеры и сетеры. (как мне кажется)


Гыыы... видимо что бы действительно казалось ты мне достаточно хорошо знаешь и "кажется" можно убрать из сообщения :D

Действительно, какие шаблоны проктирования, какая фабрика :) . По крайней мере не под данную задачу. Обычные геты и сеты.

12
02 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: dead_star

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


А зачем тебе что либо проверять то? У тебя некая директива которая должна быть установлена в любом случае. Что дефолтное, что явно заданное переназначение, все равно какое-то значение должно быть установлено.

Загружай конфиг и задавай дефольные значения для свойств экземпляра класса. Где нужно просто переназначай эти свойства на нужные величины, ведь там, где ты собираешь потом использовать эти свойства уже все равно что записано в свойство, дефолтная виличина или переназначеная, главное что она есть.

Поэтому поддержу камрада shaelf. Если у тебя все же возникают трудност, то как мне думается проблема заключена не в возможностях проверки инициированных переменных, а в неправильном проектировании системы в целом.

312
02 ноября 2007 года
dead_star
392 / / 26.11.2006
Цитата: alekciy
Если у тебя все же возникают трудност, то как мне думается проблема заключена не в возможностях проверки инициированных переменных, а в неправильном проектировании системы в целом.


согласен, но несовсем.
небывает неправильного проектирования
в моем случае я спроектировал задачу "передача конфигураций в программу" довольно ресурсоемко и при данной задаче нет необходимости затрачивать столько ресурсов. Поэтому моя реализация будет невыгодной, но это не значит что она неправельная. Эта реализация имеет ровно столько же прав на жизнь сколько имеет любая другая.

PS Всем большое спасибо за помощь. Вопросов больше не имею

12
02 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: dead_star

согласен, но несовсем.
небывает неправильного проектирования


Ты не прав. Не бывает правильного проектирования, а вот неправильное бывает ;) .

Нельзя привести некий способ следуя которому ты получишь "правильный" код, но можно привести кучу методов как писать точно направильно. Процес то програмного проектирования недетерминированный.

12
02 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: dead_star
Поэтому моя реализация будет невыгодной, но это не значит что она неправельная.


Если критическим местом системы будет производительность, то реализация именно что будет неправильной. Если же критических моментов нет и система работает как этого требуется в ТЗ, то тогда и так сойдет. Но это совершенно не показатель правильности написания системы, это просто показатель возможной пригодности её в практике.

312
02 ноября 2007 года
dead_star
392 / / 26.11.2006
сейчас наисал пару функций
по совету alekciy убрал проверку данных

Код:
<?php
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);
 }
}
?>

и соответсвенно вызов
 
Код:
$content = new Content("system.conf", "inc/");


мне понравилась работа функции parse_ini_file() которую посоветовал shaelf
единственное "но" - конфиг должен быть оформлен по стандарту php.ini, а в нем используется ";"
мне больше нравится использовать "#" поэтому я немножко заморочился

если заменить эти две строчки
 
Код:
$config_array = file($file_config); // считываем конфиг
$conf = $this->configParse($config_array); // парсим конфиг

на эти
 
Код:
$temporary_config = _DocRoot_ . $dir . "~" . md5($file);
$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
то можно ограничится одной сторкой и сэкономить куча ресурсов
 
Код:
$conf = parse_ini_file($file_config, true);


вообще конфиг компилится так что большой необходимости в экономии нет
15
02 ноября 2007 года
shaelf
2.7K / / 04.05.2005
2ReDrum Я тут на свежую голову подумал немного и ещё больше утвердился , что фабрика не нужна тут. Какую задачу у нас решает фабрика.
Задача. Нужно сделать несколько объектов на одной странички с заранее установлеными данными. Пример ученик школы, 1 класс. Делаем фабрику, в которой присваиваем в классе Человек (или ребёнок, не суть) возраст -7 лет и плодим на страничке как кроликов.
Почему он не пригоден для данной ситуации? Просто тут нужен всего 1 объект вида (смарти). Я бы вообще пошёл наверное дальше и сделал его синглтоном.
2dead_star
>>небывает неправильного проектирования
Ты даже представить себе не можешь, как ты ошибаешься...
12
03 ноября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: dead_star

мне понравилась работа функции parse_ini_file() которую посоветовал shaelf
единственное "но" - конфиг должен быть оформлен по стандарту php.ini, а в нем используется ";"


В чем проблема, не нравиться стандартные средсва напиши свой класса загрузки параметров конфигрурации. Лично я так и сделал.

15
03 ноября 2007 года
shaelf
2.7K / / 04.05.2005
А я по старинке, что дают, тем и пользуюсь))) Для меня не принципиально, что будет в качестве коммента...Хотя не, вру, я конечно переписал, но это другая история))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог