Как стать автором
Обновить

Комментарии 25

Первое правило CodeIgniter — не использовать CodeIgniter. :-)
Новый развивающийся сайт на CodeIgniter.
Кстати для программистов вроде Вас тоже будет полезен.
snippets.su
Не работаю с CodeIgniter, но по приведенному коду:

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.
а то что объекты и так передаются по ссылкам в php5 вас не смущает?
для стандартных типов еще можно было бы так экономить (и то, только если этот $CI где то изменяется в дальнейшем, т.к. в php используется copy-on-write
Не смущает, потому что это работает только внутри объектов. В процедурной парадигме, при необходимости ссылаться на объект — по умолчанию создается копия инстанции, а не ссылка на нее.

Проверить очень просто — тестом.

$CI — это суперобъект программы, немаленький.
Приведите пример, где создается копия объекта, без явного вызова clone
В хелпере, если вместо =& сделать =.

Вы знаете, как из процедурного окружения получить доступ к свойствам объекта?
1. Что вы подразумеваете под процедурным окружением?
2. Приведите простой php код, который покажет разницу в использовании памяти между =& и = при работе с объектами

п.с. я не придираюсь — просто хочу понять, кто из нас заблуждается
1. Код вне класса
2. См. выше
3. Объективно «понять» можно только в результате теста. Попробуйте, это несложно и весьма полезно. Поделитесь результатами — отличная тема для поста!

Может быть, и я отстал от тенденций. На самом деле, зачастую нет ни возможности, ни желания заниматься улучшением всего подряд — особенно тогда, когда его много, оно работает, и работает хорошо.
пример подойдет?
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
В «class A» засуньте CodeIgniter с полдюжиной моделей, данными и страницей на 100 КБ. Тогда будет TRUE, и вы меня поймете :)
Не имеет значения. Объекты в php5 передаются по ссылке. Пусть хоть 100мб весит объект — в php5 не создается копия объекта без явного вызова clone
Речь идет об оптимизации посредством экономии памяти. Масштабы и задачу обозначил. Специфику тоже. Тест некорректный, хотя результаты вы получили очевидные — разница в 1 килобайт, которая может стать разницей в n * 3 мегабайта, где n в общем случае от 1 до 8, а с HMVC до 200.

Если исходные данные «не имеют значения» — не вижу смысла продолжать обсуждение. Извините :)
Заметьте что на 1килобайт больше получилось при использовании & ;)

Еще раз говорю — либо приведите конкретный контрпример, либо изучайте теорию
сделайте в классе A str_repeat не 1000, а 1000000 раз. вы получите те же цифры:
144472
145088
Жаль, что когда использовал CI, не додумался весь функционал такого рода вынести в MY_Model.
CI для того и придумали и его сильная сторона, что он гибок донельзя. Гибкость не очень согласуется со стандартизацией.
Гибкость — основа успешной стандартизации.

Я в свое время немало поработал над разными стандартами. За свои слова отвечаю.
А можно, можно и я попридераюсь к коду? :) Заранее прошу прощения за оформление — теги не могу использовать.

if ($factors)


Такой код достаточно тяжело читается, т.к. $factors воспринимается как Boolean — что не есть правда.
if (!empty($factors)) — гараздо более читабельно.

return $this->db->
count_all_results($this->_table);
такие конструкции тяжело читаемы, особенно если выполненны на одном «уровне». Такое ощущение, что у Вас после return — строка кода.

function get_list()
Слишком много параметров (попробуй вспомни, что за чем идёт). По сути это не функция, а три или четыре функции, обьеденённые под одним именем, и доступ к ним осуществляется подбором параметров. Параметры не имееют точного типа.

перечисленные проблемы не единичны, и встречаются даже в указанном куске кода постоянно

А можно, можно и я попридераюсь к коду?


Может быть для начала родной язык выучить?
Может быть для начала родной язык выучить?

Может для начала его профиль посмотреть?
Лето кончилось… :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации