Pull to refresh

Comments 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()
Слишком много параметров (попробуй вспомни, что за чем идёт). По сути это не функция, а три или четыре функции, обьеденённые под одним именем, и доступ к ним осуществляется подбором параметров. Параметры не имееют точного типа.

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

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


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

Может для начала его профиль посмотреть?
Only those users with full accounts are able to leave comments. Log in, please.