kirill_782
@kirill_782
Днем я Маринетт

Как реализовать Registry?

Есть class
<?php

class Registry implements ArrayAccess {
    private $container = [];

    public function offsetSet($key, $value) {
        if (!$this->offsetExists($key))
            $this->container[$key] = $value;
        else
            trigger_error('Variable ' . $key . ' already defined', E_USER_WARNING);
    }

    public function offsetGet($key) {
        return $this->container[$key];
    }

    public function offsetExists($key) {
        return isset($this->container[$key]);
    }

    public function offsetUnset($key) {
        unset($this->container[$key]);
    }
}


Есть код
$registry = new Registry;

$registry['z'] = 123;
test();
function test () {
    $registry = new Registry;
    echo $registry['z'];
    echo 1;
}

По логике test должен выдать 1231. Но или я что-то не понимаю или class не рабочий
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Традиционно регистри выполняется в виде статики. все реализуется в 3 метода. Есть вообще мегапростой -
class Registry {

    private static $storage = array();

    public static function set($key,$value){
        self::$storage[$key] =$value;
    }

    public static function get($key){
        if(isset(self::$storage[$key]))
        return self::$storage[$key];
        else return false;
    }

    public static function getInstance(){
        return self::$storage;
    }

}
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
По логике test должен выдать 1231

Почему вы так считаете?
Каждый объект получает свой набор свойств, независимый от других объектов.

Если вам нужно свойство одно на все объекты этого класса - то вам нужны статические свойства static.

PS: и проверьте свой error_reporting. Похоже, вы не видите E_NOTICE
Ответ написан
Urichalex
@Urichalex
Кратко о себе)
В функции вы создаете новый экземпляр. Конечно там не будет ничего
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы