majordomo
majordomo copied to clipboard
Упрощение нагруженной функции getObject
https://github.com/sergejey/majordomo/blob/c772b18d1ddb0579820031a0b8f6d6161a333683/lib/objects.class.php#L389
Опираясь на постулат, что имя объекта в системе уникально, можно упростить весьма часто используемую функцию
function getObject($name)
{
if (trim($name)=='') return 0;
if (preg_match('/^(.+?)\.(.+?)$/', $name, $m)) { //уберём класс спереди
$name = $m[2];
}
$rec = SQLSelectOne("SELECT ID FROM objects WHERE TITLE = '".DBSafe($name)."'");
if ($rec['ID']) {
include_once(DIR_MODULES . 'objects/objects.class.php');
$obj = new objects();
$obj->id = $rec['ID'];
$obj->loadObject($rec['ID']);
return $obj;
}
return 0;
}
У себя здесь селект и разбор имени вообще убрал, передаю нейм в копию лоадобъекбутитле. В цикл.пхп только поправить вызов этой с классом
Так а выигрыш в чём? Если условие того, что имя состоит из КЛАСС.ОБЪЕКТ не сработает, то код внутри не будет выполняться.
класс.объект только в одном месте, у себя подобное исключил, ксор выше несколько сократил объем функции этой и сджойнил во второй, но я б пошел дальше
function getObject($name) { if (trim($name)=='') return 0;
include_once(DIR_MODULES . 'objects/objects.class.php');
$obj = new objects();
$obj->loadObjectByTitle($name);
return $obj;
}
Так а выигрыш в чём? Если условие того, что имя состоит из КЛАСС.ОБЪЕКТ не сработает, то код внутри не будет выполняться.
старался сохранить логику работы. вызов функции возможен с параметром $name = 'object' либо $name = 'class.object'. не понял, для чего нужна проверка на if (!$rec['ID']) с идентичным запросом, убран запрос с объединением объектов и классов. ну и сам принцип уникальности имён объектов приводит к идее Логруса об излишествах в виде класс.объект и ещё большему упрощению)
Кстати, в курсе, что разрешение символа _ в имени приводит к возможной путанице? типа объект_1 , объект11,..., объектz1 попадают по маске объект_1 (
кстати, идём в loadObject и видим там снова https://github.com/sergejey/majordomo/blob/c772b18d1ddb0579820031a0b8f6d6161a333683/modules/objects/objects.class.php#L322 SELECT * FROM objects WHERE ID=" . (int)$id ((
видим, что в getObject слазили в таблицу, нашли всю инфу по объекту и вызываем loadObject, где снова лезем туда же за уже готовым( Соглашусь с Логрусовым loadObjectByTitle ))
а так?
/**
* Summary of getObject
* @param mixed $name Object name/class.object name
* @access public
* @return int|objects
*/
function getObject($name)
{
if (trim($name)=='') return 0;
include_once(DIR_MODULES . 'objects/objects.class.php');
$obj = new objects();
$obj->loadObjectByTitle($name);
return $obj;
}
/**
* loadObjectByTitle
*
* Description
*
* @access public
*/
function loadObjectByTitle($name)
{
if (trim($name)=='') return 0;
//для совместимости
//----------------------
if (preg_match('/^(.+?)\.(.+?)$/', $name, $m)) { //уберём класс спереди
$name = $m[2];
}
//----------------------
$rec = SQLSelectOne("SELECT objects.*,classes.TITLE CL_TITLE FROM objects join classes ON objects.CLASS_ID = classes.ID WHERE objects.TITLE = '".DBSafe($name)."'");
if (IsSet($rec['ID'])) {
$this->id = $rec['ID'];
$this->object_title = $rec['TITLE'];
$this->class_id = $rec['CLASS_ID'];
$this->class_title = $rec['CL_TITLE'];
$this->description = $rec['DESCRIPTION'];
$this->location_id = $rec['LOCATION_ID'];
if (preg_match('/^sdevice(.+?)/', $rec['SYSTEM'], $m)) {
$this->device_id = $m[1];
}
} else {
return false;
}
}