ФорумПрограммированиеPHP для идиотовPHP и ООП → Как из этого класса сделать singleton

Как из этого класса сделать singleton

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2009 г. 19:28


    class AF_Config
    {
    protected $data = array();

    public function __construct(array $data)
    {
    $data = array_merge($data, $this->data);

    foreach ($data as $key => $value)
    {
    if (is_array($value))
    {
    $this->data[$key] = new self($value);
    }
    else
    {
    $this->data[$key] = $value;
    }
    }

    return true;
    }

    public function get($name, $default = null)
    {
    if (array_key_exists($name, $this->data))
    {
    $result = $this->data[$name];
    }
    elseif (isset($default))
    {
    $result = $default;
    }
    else
    {
    require_once 'AF/Exception.php';
    twrow new AF_Exception('Key "' . $name . '" does not exists in data array');
    }

    return $result;
    }

    public function __get($name)
    {
    return $this->get($name);
    }

    public function toArray()
    {
    $array = array();

    foreach ($this->data as $key => $value)
    {
    if ($value instanceof AF_Config)
    {
    $array[$key] = $value->toArray();
    }
    else
    {
    $array[$key] = $value;
    }
    }

    return $array;
    }

    public function __isset($name)
    {
    return isset($this->data[$name]);
    }
    }


    чтобы вызывать данные из data таким макаром:
    Config::getInstance()->hello->world->test->bla;
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 27 февраля 2009 г. 8:55, спустя 13 часов 26 минут 35 секунд



    class AF_Config
    {
    protected $data = array();

    public function __construct(array $data)
    {
    $data = array_merge($data, $this->data);

    foreach ($data as $key => $value)
    {
    if (is_array($value))
    {
    $this->data[$key] = new self($value);
    }
    else
    {
    $this->data[$key] = $value;
    }
    }

    return true;
    }

    public function get($name, $default = null)
    {
    if (array_key_exists($name, $this->data))
    {
    $result = $this->data[$name];
    }
    elseif (isset($default))
    {
    $result = $default;
    }
    else
    {
    require_once 'AF/Exception.php';
    twrow new AF_Exception('Key "' . $name . '" does not exists in data array');
    }

    return $result;
    }

    public function __get($name)
    {
    return $this->get($name);
    }

    public function toArray()
    {
    $array = array();

    foreach ($this->data as $key => $value)
    {
    if ($value instanceof AF_Config)
    {
    $array[$key] = $value->toArray();
    }
    else
    {
    $array[$key] = $value;
    }
    }

    return $array;
    }

    public function __isset($name)
    {
    return isset($this->data[$name]);
    }
    }


    чтобы вызывать данные из data таким макаром:
    Config::getInstance()->hello->world->test->bla;



    Конктруктор должен быть приватным, это раз. Потом ссылка статичная $instance, а в методе getInstance - вызываешь конструктор и присваиваешь обьект $instance, и соответсвенно возращаешь его. public static function & getInstance(). Попробуй так.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 27 февраля 2009 г. 13:40, спустя 4 часа 41 минуту 52 секунды

    я не спрашиваю как делать класс singleton, я спрашиваю как из этого класса сделать singleton - походу никак, так как для каждого елемента-массива создается свой объект, что в синглетоне невозможно. код хоть смотрел?)
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 27 февраля 2009 г. 19:41, спустя 6 часов 1 минуту 5 секунд


    я не спрашиваю как делать класс singleton, я спрашиваю как из этого класса сделать singleton - походу никак, так как для каждого елемента-массива создается свой объект, что в синглетоне невозможно. код хоть смотрел?)


    Код не смотрел, извиняюсь. Я понял, ты хочешь сделать нечто, что бы после преобразования $config["database"]["username"] - ты смог обращаться с этим делом так $config->database->username ?

    Если так, то я использую Zend_Config . Я передаю в конструктор $configArray, а на выходе получаю $configObject;

    И если хочешь сделать не что подобное посмотри как это у них сделано, может быть поможет.

    Aivee Framework
    ;)
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 27 февраля 2009 г. 23:27, спустя 3 часа 46 минут 4 секунды

    krasun, будь другом оформи идею такого класса в разделе ФАК, а то эта тема не в первый раз поднимается
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 28 февраля 2009 г. 2:13, спустя 2 часа 45 минут 44 секунды

    http://wiki.agiledev.ru/doku.php?id=tdd:tests_affect_architecture:singletons
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2009 г. 3:21, спустя 1 час 7 минут 39 секунд


    krasun, будь другом оформи идею такого класса в разделе ФАК, а то эта тема не в первый раз поднимается


    Вы про Zend_Config или Singleton? Если первое, то постараюсь написать.
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2009 г. 10:09, спустя 6 часов 48 минут 15 секунд



    krasun, будь другом оформи идею такого класса в разделе ФАК, а то эта тема не в первый раз поднимается


    Вы про Zend_Config или Singleton? Если первое, то постараюсь написать.

    мне кажется он имел ввиду
    что бы после преобразования $config["database"]["username"] - ты смог обращаться с этим делом так $config->database->username ?
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2009 г. 14:31, спустя 4 часа 22 минуты 2 секунды

    В принципе про Zend_Config

    и

    что бы после преобразования $config["database"]["username"] - ты смог обращаться с этим делом так $config->database->username ?


    можно написать следующее и я думаю этого достаточно


    require_once 'includes/Zend/Config.php';

    $configArray = array(
    'database' => array(
    'username' => 'Petro'
    )
    );

    $config = new Zend_Config($configArray);

    // теперь можно обращаться так
    $config->database->username;

  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 28 февраля 2009 г. 17:46, спустя 3 часа 14 минут 44 секунды

    krasun, да я про первое, и не надо ко мне на ВЫ, я не в множественном числе.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!