если сторонний класс не Singleton

iceman

говнокодер
если сторонний класс не Singleton

использую Zend_Db, он не Singleton, но в программе я использую только одно соединение, что теперь делать?

писать Класс My_Zend_Db_Singleton extends Zend_Db ? и в нем реализовывать "одиночку"

и таких классов которые я хочу использовать как одиночки много. для каждого писать "обертку"?

или в статике все хранить, типа objects::$db ?

как вообще грамотно справятся с такими задачами?
 

iceman

говнокодер
про это я не читал, ща почитаю если что напишу....

-~{}~ 12.09.08 13:43:

PHP:
<?php

class Registry
{
    static $objects = array();

    public static function getSingleton($objectName, $params = false, $method = false)
    {
        if(!isset(self::$objects[$objectName])){
            if($method){
                if($params){
                    self::$objects[$objectName] = call_user_method($method, $objectName, $params);
                } else {
                    self::$objects[$objectName] = call_user_method($method, $objectName);
                }
            } else {
                if($params){
                    self::$objects[$objectName] = new $objectName($params);
                } else {
                    self::$objects[$objectName] = new $objectName();
                }
            }
        }

        return self::$objects[$objectName];
    }
}
вот чето намудрил...

-~{}~ 12.09.08 13:48:

это правельно?

-~{}~ 12.09.08 15:01:

сорри что еще добавил, просто топик отредактировать нельзя

-~{}~ 12.09.08 15:01:

http://phpclub.ru/paste/2146

-~{}~ 12.09.08 18:49:

registry.php
PHP:
<?php

class Registry
{
    static $objects = array();

    public static function getInstance($objectName)
    {
        if(!isset(self::$objects[$objectName])){
            throw new Exception('Instance not found');
        }

        return self::$objects[$objectName];
    }
    
    public static function setInstanceMethod($objectName, $method){
        $params = func_get_args(); unset($params[0], $params[1]);

        if($params){
            self::$objects[$objectName] = call_user_func_array(
                                            array(&$objectName, $method), $params);
        } else {
            self::$objects[$objectName] = call_user_func(
                                            array(&$objectName, $method));
        }

        return self::$objects[$objectName];
    }

    public static function setInstance($objectName){
        $params = func_get_args(); unset($params[0]);

        if($params){
            $reflectionObj              = new ReflectionClass($objectName); 
            self::$objects[$objectName] = $reflectionObj->newInstanceArgs($params);
        } else {
            self::$objects[$objectName] = new $objectName();
        }

        return self::$objects[$objectName];
    }
}
example.php
PHP:
   /** Регистрируем БД как Синглетон */
    try {
        $db = Registry::getInstance('Zend_Db');
    } catch (Exception $e){
        $db = Registry::setInstanceMethod(
                                'Zend_Db',
                                'factory',
                                 new Zend_Config(require 'config.php'));
    }

    ////// Авторизация ///////
    $userProfile        = new Zend_Config(ARRAY(), TRUE);
    $authUser           = new Shef_Auth(REQUEST_LOGIN, REQUEST_PASSWORD);
    $userProfileSession = new Zend_Session_Namespace('user', Zend_Session_Namespace::SINGLE_INSTANCE);
то что я сделал и есть Registry?
 

Nelius

кипарис во дворе
iceman
В Zend Framework уже есть Registry.
Вот ссылка на мануал: Zend registry
Там написанно для чего это нужно и как пользоваться.

P.S. В написанный Вами код не вникал.
 
Сверху