Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
13 / 13 / 7
Регистрация: 02.04.2014
Сообщений: 82

Паттерн Registry и обращение к свойствам внутри объекта

04.08.2015, 19:11. Показов 1772. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Ребят подскажите, как обратиться к методам объекта, который сам уже помещен в объект?
В этом классе пытаюсь обратиться:
PHP
1
2
3
4
5
6
7
8
9
10
11
Class Controller_Index extends Controller_Base {
    function index() {
        // Проверяем есть ли в нашем классе объект `template`
        var_dump($this->registry);
        // Результат: 'template' => object(Template)[3]
        // Но если обратиться к методу `set` объекта `template` таким образом:
        $this -> registry->template->set ('first_name', 'Nikolay');
        // То получаем ошибку  Call to a member function set() on null in
        // C:\OpenServer\domains\Remeslo\controllers\index.php on line 13
    }
}
Код класса `Controller_Base`:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
Abstract Class Controller_Base {
    protected $registry;
    
    function __construct($registry) {
        $this->registry = $registry;
    }
    
    abstract function index();
}


Код класса (паттерна) Registry:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Class Registry Implements ArrayAccess {
    
    private $vars = array();
 
    function set($key, $var) {
        if (isset($this->vars[$key])) {
            throw new Exception('Enable to set var ' .$key. ' . Already set.');
        }
        $this->vars[$key] = $var;
        return true;
    }
    
    function get($key) {
        if (!isset($this->vars[$key])) {
            return NULL;
        }
    }
    
    function remove($var) {
        unset($this->vars[$var]);
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.08.2015, 19:11
Ответы с готовыми решениями:

Обращение к свойствам объекта
Доброго времени суток. У меня есть JSON файл, в котором есть лишь наборы массивов, мне нужна возможность обратиться к этим элементам при...

Обращение К Свойствам Объекта
Сегодня вдруг заинтересовало одно дело. Когда берешь из базы NotesDocument, к его полям можно обратиться как к публичным свойствам класса,...

Обращение к свойствам объекта WinForm
Только только начинаю изучать программирование, поэтому и вопрос наверное элементарный. Но все же когда-то с чего-то начинали... ...

7
> /dev/null
 Аватар для Блеф
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
04.08.2015, 19:22
Старец, у вас в объекте template нету метода set(). Приведите код template.
1
13 / 13 / 7
Регистрация: 02.04.2014
Сообщений: 82
04.08.2015, 20:38  [ТС]
Ах, за место `template` `regisrty` выложил . Как раз таки есть, в том то и дело:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Class Template {
    private $registry;
    private $vars = array();
    
    function __construct($registry) {
        $this->registry = $registry;
    }
    
    function set ($varname, $value, $overwrite = FALSE) {
        if (isset($this->vars['$varname']) AND $overwrite === FALSE) {
            trigger_error('Невозможно установить переменную `' . $varname . '`. Переменная уже установлена, и перезапись не установлена.', E_USER_NOTICE);
            return FALSE;
        }
        
        $this->vars[$varname] = $value;
        return TRUE;
    }
    
    function remove($varname) {
        unset($this->vars[$varname]);
        return TRUE;
    }
    
    function show($name) {
        $path = site_path . 'templates' . DIRSEP . $name . '.php';
        
        if (!file_exists($path)) {
            trigger_error('Шаблон `' . $name . '` не найден.', E_USER_NOTICE);
            return FALSE;
        }
        
        // Подгружаем переменные
        extract($this->vars);
    }
}


Добавлено через 19 минут
Дополнение. Даже сам объект не просматривается:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
Class Controller_Index extends Controller_Base {
    function index() {
        var_dump($this->registry->template);
        // Результат: Notice: Undefined property: Registry::$template in...
        // NULL
    }
}


Добавлено через 2 минуты
Полный вывод регистра:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
object(Registry)[1]
  private 'vars' => 
    array (size=3)
      'PDO' => 
        object(PDO)[2]
      'template' => 
        object(Template)[3]
          private 'registry' => 
            &object(Registry)[1]
          private 'vars' => 
            array (size=0)
              empty
      'router' => 
        object(Router)[4]
          private 'registry' => 
            &object(Registry)[1]
          private 'path' => string 'C:\OpenServer\domains\Remeslo\controllers\' (length=42)
          private 'args' => 
            array (size=0)
              empty
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.08.2015, 09:35
Сделайте либо так:
PHP
1
$this->registry->get('template')->set ('first_name', 'Nikolay');
Либо метод "get" класса "Registry" переименуйте в __get().
1
13 / 13 / 7
Регистрация: 02.04.2014
Сообщений: 82
05.08.2015, 11:17  [ТС]
Para bellum, к сожалению, в обоих случаях получаю фатальную ошибку.
PHP
1
2
3
4
5
        $this->registry->template->set ('first_name', 'Nikolay');
            // Результат: Call to a member function set() on null in...
 
            $this->registry->get('template')->set ('first_name', 'Nikolay');
            // Результат: Call to a member function set() on null in...
Добавлено через 35 минут
PHP
1
2
        var_dump($this->registry->get('template')); 
        // Результат: null
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.08.2015, 12:19
Лучший ответ Сообщение было отмечено Старец как решение

Решение

Блин, не досмотрел. Метод get нужно переписать же. Вот так:
PHP
1
2
3
function get($key) {
    return isset($this->vars[$key]) ? $this->vars[$key] : null;
}
И сделайте так:
PHP
1
$this->registry->get('template')->set('first_name', 'Nikolay');
1
13 / 13 / 7
Регистрация: 02.04.2014
Сообщений: 82
05.08.2015, 16:59  [ТС]
Который раз убеждаюсь, что всё работает, только нужно быть внимательнее! Благодарю Вас, ребят!

Добавлено через 10 минут
А вот мой предыдущий код всё равно выводит null, хотя по логике должен так же работать, как ваше сокращенное условие. Могли бы указать на неточность?
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
    function get($key) {
        if (!isset($this->vars[$key])) {
            return NULL;
        }
        $this->vars[$key];
    }


P.S. Ваш код работает отлично.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
06.08.2015, 07:21
Цитата Сообщение от Старец Посмотреть сообщение
Могли бы указать на неточность?
Вы не добавили "return" перед:
PHP
1
$this->vars[$key]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2015, 07:21
Помогаю со студенческими работами здесь

Обращение к свойствам дочернего объекта
Есть группа Button'ов, все они - дочерние объекты. Требуется изменить свойство конкретного д.о., не знаю как. Извините за может быть...

Обращение к неизвестным до компиляции свойствам объекта
Доброго времени суток. Есть класс Data с открытыми свойствами: class Data { private int m1; private...

Обращение к свойствам однотипного кликнутого объекта
Привет, прошу помочь разобраться с назревшим вопросом. var arr = new Array(), i; for(i = 0; i < 10; i++) { arr = new...

Как перехватить обращение к предопределенным свойствам объекта
Небольшой пример public class MyClass extends Proxy { public const VALUE_1:int = 4; public const VALUE_2:Array = ; ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru