Бережём память в PHP
17 December 2007Я люблю писать красивый код, но люблю и лаконичный, чтобы не было ничего левого и ненужного. Конечно, не до такой степени, чтобы страдала читабельность. И вот сегодня, пописывая, заметил нунужные строки в коде. Было где-то так:
$letter = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
if(isset($ex[$letter])){
$tmp['class'] = ‘exist’;
} else {
$tmp['class'] = ”;
}
$tmp['letter'] = $letter;
Как видно с кода сначала в переменную $letter чево-то там заганяется, а потом проверяется нуществование значения $ex[$letter]. Если нет, то в $tmp['class'] записывается пустое значение, иначе - ‘exist’. Ну и в конце записывается данные $letter в $tmp['letter']. В этом коде меня напрягла переменная $letter и я решил от неё избавится. Это сделать просто:
$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i)); if(isset($ex[$tmp['letter']])){ $tmp['class'] = ‘exist’; } else { $tmp['class'] = ”; }
Теперь у нас ничего в память левого не заганяется. Но если идти дальше, то это же можно записать в 2 строки:
Вариант 1.
$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
(isset($ex[$tmp['letter']]))?$tmp['class'] = ‘exist’: $tmp['class'] = ”;
Но можно ещё короче!
Вариант 2.
(isset($ex[$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i))]))?$tmp['class'] = ‘exist’: $tmp['class'] = ”;
Но эта конструкция уже сильно запутаная и использывать её не стоит - уж больно читаемый PHP стал похож на Perl.
Вот как 6 строчек кода можно превратить в 2 без ущерба читаемости и с экономией одной сототой килобайта памяти
Update
Тут в комментариях друг Star высказался о ещё одном уменшении размера строки, но это уже больше относится к “уменшим размер - не прочитаем код”. Он предлагает уменшить строки
(isset($ex[$tmp['letter']]))? $tmp['class'] = ‘exist’: $tmp['class'] = ”;
и как результат мы получим вариант 1 и 2 в таком виде:
Вариант 1.2.
$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
$tmp['class'] = isset($ex[$tmp['letter']])? ‘exist’: ”;
Вариант 2.2.
$tmp['class'] = isset($ex[$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i))])? ‘exist’: ”;



12 Responses to “Бережём память в PHP”
December 17th, 2007 at 2:21 pm
я уже тебе говорил, когда говнопхпешники косят под красноглазосипипишников - это к добру не приводит.
код - это байты, где маркетинг, где любовь к людям?
December 17th, 2007 at 2:39 pm
Какой к чёрту маркетинг? Ты читать умеешь - последную строчку НЕ ИСПОЛЬЗЫВАТЬ! А если Вы, сударь, сейл, то это не означает, что код в 2 простые строчки сложный.. И если ты, по своей тугодумности, не осилил короткую запись оператора условия, то пора с сейлом завязывать )))
Нет, не пора - каждому своё.
December 17th, 2007 at 2:54 pm
я ні хрена в цьму не поняв
December 17th, 2007 at 3:06 pm
отож, а ше хош программувати… Їди на курси до говновкусняшки - він тебе продавати Тайд навчить )
December 17th, 2007 at 3:59 pm
о
да-да, вот уже народ подтягивается, который тоже не догнал. Нет просто в этих строках любви к Людям, не для Людей они, не правильно это.
December 17th, 2007 at 4:13 pm
ибо чаловек этот ниграма не шарит в программировании. Ты для него - ГУРУ в программировании ). Кирпичик колько мну задалбывает, чтобы я иво научил программить.. Он всех задалбывает
December 17th, 2007 at 4:19 pm
от йопт, никакой адекватной оппозиции создать не получается
December 19th, 2007 at 3:44 pm
to №7
сударь, судя по нику у вас развилась самокритика! поздравляю!
December 20th, 2007 at 2:29 pm
2 8:
говнокоммент, важна не форма - а суть.
December 20th, 2007 at 6:57 pm
всё теперь стало на свои места - суть у тебя в говновкуснешеке.
January 15th, 2008 at 9:07 pm
чувак вот такие конструкции
(isset($ex[$tmp[‘letter’]]))?$tmp[‘class’] = ‘exist’: $tmp[‘class’] = ”;
удобнее писать в таком виде:
$tmp[‘class’] = isset($ex[$tmp[‘letter’]])) ? ‘exist’ : ”
January 16th, 2008 at 12:54 pm
Да, спсб что напомлин. Юзается иногда с маленькими конструкциями. Ибо у тебя, наверно, тоже был Сидоров и он точно говорил, что в блок схеме алгоритма должно быть нарисовано так:
а не наоборот. С этим можно спорить долго, но в сложных конструкциях лучше не исспользовать, так как сложно потом читать.
Хотя, если в выражении мало букв, то можно. Вот и только-что нашёл в коде:
$this->result['status'] = ($return_value)?’ok’:'bad’;
Тут прочитать не сложно.
В любом случае - спасибо, сейчас поправлю заметочку с твоим комментарием.