Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: class_exists загружает класс
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Столкнулся с интересным нюансом при организации динамического кэша.
При использовании автозагрузки классов всем известная функция class_exists(), которая должна проверять, существует ли класс, не просто проверяет, но и загружает класс. Выявляется это и несколько вводит в заблуждение, если после вызова функции динамически изменить класс, т.е. переписать файл.
Вместо ожидаемого (мной) 'Класс some_class существует, 2', на экран выводится 'Класс some_class существует, 1'...
В принципе, ничего удивительного тут нет и логика понятна. Class_exists() проверяет наличие класса, т.е. был ли он загружен, при этом при обращении к классу происходит его автозагрузка. Далее динамические изменения файла уже ни на что не влияют, т.к. файл в новом виде уже не подгружается и используется старый класс.
class_name
Имя класса. Воспринимается без учета регистра.
autoload
Вызывать ли по умолчанию __autoload.
Там фишка в том, что я при помощи class_exists по сути проверял наличие файла. У меня идет проверка есть ли файл и не устарел ли он. Но вместо file_exists я наивный хотел использовать более 'целевую' функцию class_exists, но оказалось, что был не прав.
В принципе, если бы не надо было проверять не устарел ли файл, то я бы воспользовался флагом autoload в class_exists, но у меня, если файл устарел, его надо поменять и только после этого он используется и, соответственно, загружается.
DeepVarvar
Отправлено: 10 Августа, 2015 - 08:50:16
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
DeepVarvar пишет:
MAXUS пишет:
есть ли файл и не устарел ли он
http://php.net/manual/ru/function.filemtime.php
Да это-то понятно
Мелкий
Отправлено: 10 Августа, 2015 - 10:51:13
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
MAXUS пишет:
if (version_compare(phpversion(), '5.3.0', '>='))
MAXUS пишет:
__DIR__
Вы уж определитесь: или реально писать и тестировать код на всякой фигне или же выкидывать ненужный код сразу, дабы не засорять.
MAXUS пишет:
при организации динамического кэша.
Стукните по башке архитектору томиком GoF (или ещё чем тематическим) и используйте адекватные задаче шаблоны проектирования.
----- PostgreSQL DBA
MAXUS
Отправлено: 10 Августа, 2015 - 12:06:52
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Мелкий пишет:
MAXUS пишет:
if (version_compare(phpversion(), '5.3.0', '>='))
MAXUS пишет:
__DIR__
Вы уж определитесь: или реально писать и тестировать код на всякой фигне или же выкидывать ненужный код сразу, дабы не засорять.
MAXUS пишет:
при организации динамического кэша.
Стукните по башке архитектору томиком GoF (или ещё чем тематическим) и используйте адекватные задаче шаблоны проектирования.
Ну, то что __DIR__ в 5.2 не работает это понятно. Просто кусок кода выдрал из того, что под 5.2 тоже должно работать.
А насчет шаблонов. Можно непосредственно мне по башке стукнуть и подсказать, какой адекватный шаблон использовать для кэширования в шаблонизаторе?
Опишу задачу.
Есть файл вида (HTML со вставками кода шаблонизатора). Он парсится и создается файл с классом с определенным именем в папке с кэшем (назовем это так).
При запуске страницы сначала проверяется скомпилированный кэш-файл с классом. Если его нет или он протух (определяется по нескольким параметрам, не только по времени файла), то файл вида перекомпилируется.
После этого используется скомпилированный класс.
Прям любопытно стало, это стандартная смс была, которая автоматически постится, типа "я занят" насчет шаблонов или что-то конкретное имеется в виду и есть какой-то шаблон, который решает задачу?
Дополнение
ЗЫ Мне кажется, что количество невинно убиенных томиком GoF в мире (или только в России) растет неоправданно быстрыми темпами
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Это ещё и шаблонизатор? Ну вот зачем вам там динамические классы?
С приложением должен общаться порождающий паттерн, приложение не должно задумываться, из кеша это чтение было сделано или более дорогим способом каким-то. Для шаблонов уместна фабрика, которая будет порождать объект с требуемыми характеристиками. Дальше (обычно при построении объекта самим объектом, чтобы фабрика о кешах не знала тоже) можно пнуть кэширующий прокси, который отдаст данные из кеша или, в случае промаха, пнёт тяжеловесный метод построения шаблона и, попутно, сохранения результата построения в кэш.
----- PostgreSQL DBA
MAXUS
Отправлено: 10 Августа, 2015 - 12:57:56
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Мелкий пишет:
Это ещё и шаблонизатор? Ну вот зачем вам там динамические классы?
Очень хороший и удобный подход. Используется, например, в Twig.
Мелкий пишет:
С приложением должен общаться порождающий паттерн, приложение не должно задумываться, из кеша это чтение было сделано или более дорогим способом каким-то. Для шаблонов уместна фабрика, которая будет порождать объект с требуемыми характеристиками. Дальше (обычно при построении объекта самим объектом, чтобы фабрика о кешах не знала тоже) можно пнуть кэширующий прокси, который отдаст данные из кеша или, в случае промаха, пнёт тяжеловесный метод построения шаблона и, попутно, сохранения результата построения в кэш.
Да так все и происходит примерно. Я только не пойму как из примера, который я запостил, можно было сделать какие-то выводы об архитектуре приложения, которые бы позволяли рукоприкладствовать бумажной версией книги о шаблонах проектирования?
Мелкий
Отправлено: 10 Августа, 2015 - 13:11:58
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
MAXUS пишет:
Да так все и происходит примерно.
Ну и зачем вам тогда тут классы? Кеш пишется и читается в одном месте. Зачем вообще автозагрузчику знать о кеше?
Зачем строковые данные превращать в исполняемый код?
MAXUS пишет:
Я только не пойму как из примера, который я запостил, можно было сделать какие-то выводы об архитектуре приложения
По генерации класса. Класса!
----- PostgreSQL DBA
MAXUS
Отправлено: 10 Августа, 2015 - 13:19:05
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Мелкий пишет:
MAXUS пишет:
Да так все и происходит примерно.
Ну и зачем вам тогда тут классы? Зачем строковые данные превращать в исполняемый код?
Тут я бы порекомендовал посмотреть, как и зачем это делается в Twig. В двух словах, шаблон может содержать переменные, условные конструкции, циклы, исполнение которых зависит от передаваемых параметров. Соответственно, либо парсить шаблон каждый раз, либо создать один раз класс и пользоваться им, пока шаблон не изменится.
Класс удобно использовать, потому что есть автозагрузка. И вообще, класс удобно использовать
Мелкий
Отправлено: 10 Августа, 2015 - 13:34:31
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Да, про исполняемый код я загнул, исполняемым ему быть надо. А вот классом - нет.
Контрпримеры: laravel/blade, nette (будь он неладен, но для примера подойдёт).
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.