[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как оживить код (static array)
grigory.svetlanin
Добрый вечер. Друзья в php как сделать так, что бы ожила примерно такая конструкция?
class ContextSupport {

private static $proppertySupports = array();

private function __construct() {

}


public static function getSupport(Component $comp) {
$t = self::proppertySupports[$comp];
if (is_null($t)) {
$t = ContextSupport::proppertySupports;
$t[$comp] = new ProppertySupport();
}
return $t[$comp];
}

}

ошибка такая
Parse error: syntax error, unexpected '[' in мой_путь\granat\frontend\ContextSupport.php on line 28
Arh
Во первых ошибка синтаксиса.
$t = self::$proppertySupports[$comp];
знак $ забыл.

Во творах непонятно что ты хочешь сделать. Ты пытаешься получить значение по ключу равному $comp, а там объект Component.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
grigory.svetlanin
Спасибо мил человек. Забываю всегда про доллары. Надо вешать наклейку на монитор!

Я хочу, из $proppertySupports вытаскивать значение(ProppertySupport) по ключу(Component), если его нет, создавать новый и присвоить это значение $proppertySupports, чтобы потом вытаскивать уже созданный конкретный ProppertySupport конкретного Component. Component просто имеет дочерних таких же компонентов кучку и каждому нужен свой.

Примерно так использую (в теории)

function setHierarchyManager($hierarchyManager) {
$oldHierarchyManager = $this->hierarchyManager;
ContextSupport::getSupport($this)->executEvent(PropertyEvent($this, 'SET_HIERARCHY_MANAGER', $oldHierarchyManager, $hierarchyManager));
$this->hierarchyManager = $hierarchyManager;
}
Arh
Объект в качестве ключа не получиться указать. Можно попробовать через spl_object_hash например.

// где то добавляешь
self::$proppertySupports[spl_object_hash($comp)] = $comp;

// потом при получении проверяешь
if (!isset(self::$proppertySupports[spl_object_hash($comp)])) {
self::$proppertySupports[spl_object_hash($comp)] = new ProppertySupport();
}

return self::$proppertySupports[spl_object_hash($comp)];


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
grigory.svetlanin
Цитата
Объект в качестве ключа не получиться указать.

Да радость от идеи "объект в качестве ключа" длилась не долго. Я нагуглил вчера, что массивы не могут принимать в качестве ключа кроме string и int ничего. Думал как реализовать java аналог hashCode(); и наткнулся на spl_object_hash в доке говорится, что при уничтожении объекта хеш может быть присвоен другому новому объекту. И по этому поводу некоторые пишут, что может произойти какой нибудь коллапс с базой данных. Оно и понятно значение одного объекта можно записать другому. Но можно я думаю смешать время создания объекта со значением spl_object_hash или (пока не тестил) SplObjectStorage

class ContextSupport {

private static $proppertySupports;

private function __construct() {

}


public static function getSupport(Component $comp) {

if (is_null(self::$proppertySupports)) {
self::$proppertySupports = new \SplObjectStorage();
}

if (!self::$proppertySupports->contains($comp)) {
self::$proppertySupports[$comp] = new ProppertySupport();
}

return self::$proppertySupports[$comp];
}

}


надо попробовать оба варианта и выбрать который быстрей, но мне кажется SplObjectStorage проиграет по скорости варианту с spl_object_hash потому, что self::$proppertySupports->contains($comp); наверняка трудозатратная операция.

Arh СПАСИБО за помощь!

Потом отпишусь, что в итоге получилось для тех кому будет это интересно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.