Комментарии 25
Первое правило CodeIgniter — не использовать CodeIgniter. :-)
Новый развивающийся сайт на CodeIgniter.
Кстати для программистов вроде Вас тоже будет полезен.
snippets.su
Кстати для программистов вроде Вас тоже будет полезен.
snippets.su
Не работаю с CodeIgniter, но по приведенному коду:
1. не проще ли в set_related сделать приведение дата к массиву в самом начале и избавиться от дублирования кода?
чтобы получилось что-то вроде (форматирование кода свое использую, т.к. запись компактнее получается и на мой взгляд так читабельнее, чем когда каждая фигурная скобка на новой строке)
2. $CI =& get_instance(); вы работаете с php4?
1. не проще ли в set_related сделать приведение дата к массиву в самом начале и избавиться от дублирования кода?
чтобы получилось что-то вроде (форматирование кода свое использую, т.к. запись компактнее получается и на мой взгляд так читабельнее, чем когда каждая фигурная скобка на новой строке)
function set_related($data, $key = 'uid')
{
if (!$data) {
return;
}
$data = (array)$data;
if (isset($data[$key])) {
$this->list[$data[$key]] = false;
return;
}
foreach ($data as $row) {
if (is_object($row)) {
if (isset($row->$key)) {
$this->list[$row->$key] = false;
}
} elseif (is_array($row)) {
if (isset($row[$key])) {
$this->list[$row[$key]] = false;
}
} elseif (is_numeric($row)) {
$this->list[$row] = false;
}
}
}
2. $CI =& get_instance(); вы работаете с php4?
Не проще, потому что set_related() позволяет передавать данные в различных форматах:
— массив массивов
— массив объектов
— объект
— массив
— целочисленное значение
PHP4 не при делах, это просто оптимизация. $CI =& get_instance(); используется для банальной экономии памяти в хелперах, когда необходимо ссылаться на объектную составляющую в процедурной парадигме.
Разницу можно заметить при тестировании. В нормальном среднем случае потребляется 3 МБ на запрос. Если не ловить инстанцию ссылкой — плюс 3 МБ на каждый вызов функции в спорном окружении. В высоконагруженной системе может приводить к фатальным потерям и падениям PHP.
— массив массивов
— массив объектов
— объект
— массив
— целочисленное значение
PHP4 не при делах, это просто оптимизация. $CI =& get_instance(); используется для банальной экономии памяти в хелперах, когда необходимо ссылаться на объектную составляющую в процедурной парадигме.
Разницу можно заметить при тестировании. В нормальном среднем случае потребляется 3 МБ на запрос. Если не ловить инстанцию ссылкой — плюс 3 МБ на каждый вызов функции в спорном окружении. В высоконагруженной системе может приводить к фатальным потерям и падениям PHP.
а то что объекты и так передаются по ссылкам в php5 вас не смущает?
для стандартных типов еще можно было бы так экономить (и то, только если этот $CI где то изменяется в дальнейшем, т.к. в php используется copy-on-write
для стандартных типов еще можно было бы так экономить (и то, только если этот $CI где то изменяется в дальнейшем, т.к. в php используется copy-on-write
Не смущает, потому что это работает только внутри объектов. В процедурной парадигме, при необходимости ссылаться на объект — по умолчанию создается копия инстанции, а не ссылка на нее.
Проверить очень просто — тестом.
$CI — это суперобъект программы, немаленький.
Проверить очень просто — тестом.
$CI — это суперобъект программы, немаленький.
Приведите пример, где создается копия объекта, без явного вызова clone
В хелпере, если вместо =& сделать =.
Вы знаете, как из процедурного окружения получить доступ к свойствам объекта?
Вы знаете, как из процедурного окружения получить доступ к свойствам объекта?
1. Что вы подразумеваете под процедурным окружением?
2. Приведите простой php код, который покажет разницу в использовании памяти между =& и = при работе с объектами
п.с. я не придираюсь — просто хочу понять, кто из нас заблуждается
2. Приведите простой php код, который покажет разницу в использовании памяти между =& и = при работе с объектами
п.с. я не придираюсь — просто хочу понять, кто из нас заблуждается
1. Код вне класса
2. См. выше
3. Объективно «понять» можно только в результате теста. Попробуйте, это несложно и весьма полезно. Поделитесь результатами — отличная тема для поста!
Может быть, и я отстал от тенденций. На самом деле, зачастую нет ни возможности, ни желания заниматься улучшением всего подряд — особенно тогда, когда его много, оно работает, и работает хорошо.
2. См. выше
3. Объективно «понять» можно только в результате теста. Попробуйте, это несложно и весьма полезно. Поделитесь результатами — отличная тема для поста!
Может быть, и я отстал от тенденций. На самом деле, зачастую нет ни возможности, ни желания заниматься улучшением всего подряд — особенно тогда, когда его много, оно работает, и работает хорошо.
пример подойдет?
результат:
144488
145088
ini_set('error_reporting', E_ALL & ~E_STRICT);
class A {
protected $arr;
public function __construct() {
$this->arr = str_repeat('abc', 1000);
}
}
$instance = new A();
function get_instance() {
global $instance;
return $instance;
}
function foo() {
$mem = memory_get_usage();
$arr = array();
for ($i = 0; $i < 1000; $i++) {
$arr[$i] = get_instance();
}
echo memory_get_usage() - $mem, "\n";
}
function bar() {
$mem = memory_get_usage();
$arr = array();
for ($i = 0; $i < 1000; $i++) {
$arr[$i] =& get_instance();
}
echo memory_get_usage() - $mem, "\n";
}
foo();
bar();
результат:
144488
145088
кроме того, при включенном E_STRICT вы увидите ошибку
Strict Standards: Only variables should be assigned by reference
Strict Standards: Only variables should be assigned by reference
В «class A» засуньте CodeIgniter с полдюжиной моделей, данными и страницей на 100 КБ. Тогда будет TRUE, и вы меня поймете :)
Не имеет значения. Объекты в php5 передаются по ссылке. Пусть хоть 100мб весит объект — в php5 не создается копия объекта без явного вызова clone
Речь идет об оптимизации посредством экономии памяти. Масштабы и задачу обозначил. Специфику тоже. Тест некорректный, хотя результаты вы получили очевидные — разница в 1 килобайт, которая может стать разницей в n * 3 мегабайта, где n в общем случае от 1 до 8, а с HMVC до 200.
Если исходные данные «не имеют значения» — не вижу смысла продолжать обсуждение. Извините :)
Если исходные данные «не имеют значения» — не вижу смысла продолжать обсуждение. Извините :)
del
Жаль, что когда использовал CI, не додумался весь функционал такого рода вынести в MY_Model.
CI для того и придумали и его сильная сторона, что он гибок донельзя. Гибкость не очень согласуется со стандартизацией.
А можно, можно и я попридераюсь к коду? :) Заранее прошу прощения за оформление — теги не могу использовать.
if ($factors)
…
Такой код достаточно тяжело читается, т.к. $factors воспринимается как Boolean — что не есть правда.
if (!empty($factors)) — гараздо более читабельно.
return $this->db->
count_all_results($this->_table);
такие конструкции тяжело читаемы, особенно если выполненны на одном «уровне». Такое ощущение, что у Вас после return — строка кода.
function get_list()
Слишком много параметров (попробуй вспомни, что за чем идёт). По сути это не функция, а три или четыре функции, обьеденённые под одним именем, и доступ к ним осуществляется подбором параметров. Параметры не имееют точного типа.
перечисленные проблемы не единичны, и встречаются даже в указанном куске кода постоянно
if ($factors)
…
Такой код достаточно тяжело читается, т.к. $factors воспринимается как Boolean — что не есть правда.
if (!empty($factors)) — гараздо более читабельно.
return $this->db->
count_all_results($this->_table);
такие конструкции тяжело читаемы, особенно если выполненны на одном «уровне». Такое ощущение, что у Вас после return — строка кода.
function get_list()
Слишком много параметров (попробуй вспомни, что за чем идёт). По сути это не функция, а три или четыре функции, обьеденённые под одним именем, и доступ к ним осуществляется подбором параметров. Параметры не имееют точного типа.
перечисленные проблемы не единичны, и встречаются даже в указанном куске кода постоянно
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Стандарт разработки приложений на CodeIgniter