Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
4 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 145

Обращение к массиву свойств

29.09.2016, 12:34. Показов 2141. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не дурак, сразу понял, что свойство объекта нужно вызывать так: $object->property;
Но встретил следующий код:
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
36
37
38
39
40
41
42
43
44
45
46
47
class Class
{
    // Свойства - Классы API
    private $classes = array(
        'config'     => 'Config',
        'request'    => 'Request',
        'db'         => 'Database',
    );
    
    // Созданные объекты
    private static $objects = array();
    
    public function __construct()
    {
        //error_reporting(E_ALL & !E_STRICT);
    }
 
    /**
     * Метод, создает нужный объект API
     */
    public function __get($name)
    {
        // Если такой объект уже существует, возвращаем его
        if(isset(self::$objects[$name]))
        {
            return(self::$objects[$name]);
        }
        
        // Если запрошенного API не существует - ошибка
        if(!array_key_exists($name, $this->classes))
        {
            return null;
        }
        
        // Определяем имя нужного класса
        $class = $this->classes[$name];
        
        // Подключаем его
        include_once(dirname(__FILE__).'/'.$class.'.php');
        
        // Сохраняем для будущих обращений к нему
        self::$objects[$name] = new $class();
        
        // Возвращаем созданный объект
        return self::$objects[$name];
    }
}
И потом в подклассах уже просто вызывается, например, $this->db;

Насколько я понял, благодаря этой строке "self::$objects[$name] = new $class();" получается как бы $db = new Database();

Но до меня не доходит как это получается. В моем понимании это выглядит так : self::$objects['db'] = new Database();

Кто может разжевать подоступнее?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2016, 12:34
Ответы с готовыми решениями:

Изменение свойств контролов по массиву имен
Допустим у меня есть 1024 кнопки и у всех их visible=false и имена у них вписаны от балды, но есть их имена в массиве строк. Как у всех их...

Обращение к массиву
Всем доброго времени суток. Есть код, который при выполнение вызывает определенный магазин под номером 10001. Но только один: ...

Обращение к массиву
Добрый день, не смотря на тривиальную тему заголовка вопросы у меня серьезные: 1. Как создать массивы (arr1, arr2, arrn) в цикле for....

9
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
29.09.2016, 12:44
http://php.net/manual/ru/language.oop5.static.php
http://php.net/manual/ru/langu... otayim.php
1
4 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 145
29.09.2016, 13:11  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
http://php.net/manual/ru/language.oop5.static.php
http://php.net/manual/ru/langu... otayim.php
Мне это не помогло Про статические свойства и методы, и про :: я вроде как понимаю.
Мне в приведенном мной коде непонятно как "self::$objects[$name] = new $class();" интерпретируется как $db = new Database (); Для меня это выглядит так: self::$objects['db'] = new Database();
Это если для примера взять $name = 'db'
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
29.09.2016, 13:14
Цитата Сообщение от Novichek_9I Посмотреть сообщение
В моем понимании это выглядит так : self::$objects['db'] = new Database();
Ну так и есть. А вопрос то в чем?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
29.09.2016, 13:16
Я так понял, вопрос в том что свойства вызываются так: $this->db; Читать тут
1
4 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 145
29.09.2016, 13:35  [ТС]
Ладно, понятней вроде стало, хоть и не до конца Со временем может пойму )
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
29.09.2016, 13:59
Novichek_9I, в PHP есть такое понятие, как "магические методы". То есть вызов этих методов происходит неявно.
Если в объекте переопределяется метод __get, то при обращении к несуществующему свойтву объекта не будет Notice: Undefined property, а вызовется метод __get($name), где $name - это имя свойства.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Obj
{
    private $secret = [
        'a' => 'A',
        'b' => 'B'
    ];
 
    public $c = 'C';
 
    public function __get($name)
    {
        return $this->secret[$name];
    }
}
 
$o = new Obj();
echo $o->a;
echo $o->invalidProperty; // Здесь будет Notice: Undefined index
echo $o->c;
Или если определить в классе метод __toString, то этот метод будет неявно вызван при попытке преобразовать экземпляр этого класса в строку:
PHP
1
2
3
4
5
6
7
8
9
class Obj
{
    public function __toString()
    {
        'Hello';
    }
}
$o = new Obj();
echo $o; // выведет Hello
1
4 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 145
30.09.2016, 08:14  [ТС]
j2FunOnly, спасибо, Вы объяснили гораздо лучше, чем в мануале
Но здесь у меня другой тогда вопрос. Свойства же можно объявлять неявно, то есть при первом же их использовании. Зачем тогда магические методы и откуда ошибка Notice: Undefined property ?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
30.09.2016, 09:00
Цитата Сообщение от Novichek_9I Посмотреть сообщение
Свойства же можно объявлять неявно
А можно и не объявлять, тогда и будет ошибка...
Цитата Сообщение от Novichek_9I Посмотреть сообщение
то есть при первом же их использовании
А как Вы будете отслеживать - это первое использование или нет?

Вот скрипт, который Вы привели сверху, этим и занимается. Только свои "свойства" он хранит не как свойства, а как элементы приватного массива, чтобы проще с ними было обращаться.
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
01.10.2016, 17:58
Лучший ответ Сообщение было отмечено Novichek_9I как решение

Решение

Цитата Сообщение от Novichek_9I Посмотреть сообщение
Зачем тогда магические методы и откуда ошибка Notice: Undefined property ?
PHP
1
2
3
4
5
6
class SomeClass
    {}
    
    $some = new SomeClass;
    $some->a = 'b'; // не будет ноутиса, т.к. свойству присваивается значение
    echo $some->b; // будет ноутис, т.к. свойство не имеет значения и, соответственно, не установлено
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2016, 17:58
Помогаю со студенческими работами здесь

Обращение к массиву
Добрый вечер. Из подключенной БД создаю массив, а затем работаю с ним. В таблице БД 2 столбца - id и name. $dis = "SELECT * FROM...

Обращение к массиву.
Подскажите пожалуйста, возможно ли следующее: У меня есть два массива M1 и M2. Я к ним обращаюсь так: case i of 1: begin M1:=2;...

Обращение к многомерному массиву
Доброго времени суток, подскажите, может я чего не вижу, есть двухмерный ассоциативный массив формата json $arrays = array(2) { =>...

Обращение к внутреннему массиву
Добрый день. Подскажите, пожалуйста. Есть некий массив из 4 значений. Каждое значение представляет собой еще один массив из 2...

Обращение к массиву структур
Структура объявлена в отдельной трансляции, там же объявлена функция заполнения двумерного массива структур, а по возвращении в main не...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru