PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (16): В начало « ... 8 9 10 11 12 13 14 [15] 16 »

> Найдено сообщений: 232
_Dark_ Отправлено: 20 Октября, 2012 - 20:29:23 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
caballero пишет:
для себя проясни сначала

В этом суть этой темы:
_Dark_ пишет:
Есть ли у вас какие-нибудь варианты и предложения решения этой проблемы?

Огорчение


caballero пишет:
и какая проблемма с этим вариантом?

_Dark_ пишет:
Мне (почему-то) кажется, что это не очень хорошо, если потребуется подключить 10 модулей в конструкторе будет 10 получений экземпляров, а число полей класса так же увеличиться на 10.


И орфографию свою проверьте, читать не очень удобно.
_Dark_ Отправлено: 20 Октября, 2012 - 20:15:13 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
Я для вас поясню.

Есть класс, экземпляр которого нужно использовать в контексте другого класса.
Пусть это будет класс Database

PHP:
скопировать код в буфер обмена
  1.  
  2. class Database { /* тело класса*/ }
  3.  


Пусть класс Sure хочет использовать класс Database. Необходимо передать в контекст класса Sure экземпляр класса Database для использования.

Вариант 1-ый, на котором вы и зациклились:

класс Database — синглтон, мы получаем его экземпляр прямо от него самого.

PHP:
скопировать код в буфер обмена
  1. class Sure {
  2.     private $db; // Это внутренняя переменная в которой будет храниться экземпляр класса Database
  3.  
  4.      public function __construct() {
  5.          $this->db = Database::instance(); // Помещаем экземпляр класса в $db.
  6.      }
  7.  
  8.      public function method1() {
  9.          $this->db->query(/* ... */); // Работаем с классом Database. Переменная $db — линк на класс, чтобы не получать каждый раз его экземпляр там где он требуется. Ярлык, сокращение.
  10.      }
  11. }


Извините меня, не знаю как еще объяснить.
_Dark_ Отправлено: 20 Октября, 2012 - 20:04:43 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
_Dark_ пишет:
Мне (почему-то) кажется, что это не очень хорошо, если потребуется подключить 10 модулей в конструкторе будет 10 получений экземпляров, а число полей класса так же увеличиться на 10.
_Dark_ Отправлено: 20 Октября, 2012 - 19:42:56 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
Здравствуйте.

Необходимо решить следующую задачу:

Существует несколько модулей, пусть это будут
    Applications
    Cache
    Database

Допустим в классе Test мне нужно получить доступ к объекту Cache, а заодно и к Database.

Первое что пришло в голову — использовать Singleton, проблема в том, что в каждом классе придется делать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Test {
  3.     private $cache;
  4.     private $database;
  5.  
  6.     public function __construct() {
  7.         $this->cache = Cache::instance();
  8.         $this->database = Database::instance();
  9.     }
  10. // Дальше в методах работаем с $this->cache, $this->database и т.д.
  11. }
  12.  

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

Один из других вариантов было использование целиком статичных классов, где экземпляр собственно и не нужен, но тогда я лишаюсь полноценного ООП, в частности, я не могу пользоваться магическими методами, мне придется определять свои конструкторы, деструкторы и т.п.

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

Есть ли у вас какие-нибудь варианты и предложения решения этой проблемы?

Да, на StackOverflow я нашел много подобных вопросов, но внятных ответов, увы, не было, были в основном синглтоны. В одном ответе я видел предложение использовать "Dependency Injection", сколько я не спрашивал у Google так и не получил нужную информацию касательно этого.
Проясните ситуацию, как лучше реализовать это дело?

Спасибо.
_Dark_ Отправлено: 17 Октября, 2012 - 17:53:42 • Тема: Кэширование данных в файл • Форум: Объектно-ориентированное программирование

Ответов: 9
Просмотров: 4547
Мелкий пишет:
Очень интересно. А какая версия PHP?

Apache 2.4.3 VC10, PHP 5.4.6

И все же хотелось бы получить ответ на вопрос "Чем плох этот вариант?"
_Dark_ Отправлено: 17 Октября, 2012 - 14:30:48 • Тема: Кэширование данных в файл • Форум: Объектно-ориентированное программирование

Ответов: 9
Просмотров: 4547
Господа, не уходите от темы Улыбка

Можно ли сделать так, как я указал выше?

Мелкий пишет:
Желательно с json'ом, который значительно быстрее сериализации, но и сохранить может не всё.

Проверил.
Пара json_encode / json_decode медленнее serialize / unserialize в ~7 раз.
Проверял на примере ассоциативного массива из 700 элементов, содержание ключей и значений — строки.
_Dark_ Отправлено: 16 Октября, 2012 - 20:38:59 • Тема: Кэширование данных в файл • Форум: Объектно-ориентированное программирование

Ответов: 9
Просмотров: 4547
Разве нельзя сделать что-то вроде
PHP:
скопировать код в буфер обмена
  1. $content = <<<PHP
  2. <?PHP
  3. \$abc = \$data; // где $data - мой массив с данными
  4. ?>
  5. PHP;
  6. // И далее запись в файл
  7.  


А для получения этих данных
PHP:
скопировать код в буфер обмена
  1.  
  2. require_once '...';
  3. return $abc;
  4.  


Насчет хэша в имени понятно, для того, чтобы файл имел корректное имя всегда.

Меня интересует простой кэш данных, я не хочу хранить там никаких страниц и т.д., просто есть операции результат которых изменяется только в определенный момент, я хочу этот результат сохранить и просто загружать его, вместо того, чтобы высчитывать его заново.

chubrick пишет:
И вообще, кэш это не для людей, а для программы, поэтому ему незачем иметь понятное имя.

Мне кажется, что для программы тоже проще просто взять переменную с данными, чем вначале десереализовывать их. Конечно я могу ошибаться.
_Dark_ Отправлено: 16 Октября, 2012 - 19:05:12 • Тема: Кэширование данных в файл • Форум: Объектно-ориентированное программирование

Ответов: 9
Просмотров: 4547
Доброго времени суток.
Я пишу свою собственную разработку и подошел к моменту когда мне необходимо реализовать кэширование данных в файл, т.к. существуют операции результат которых изменяется не часто и нет необходимости при каждом запуске скрипта проводить обработку данных.

Меня не интересует реализация, у меня вопрос чисто по концепции кэширования.
В различных CMS, скриптах и т.п. кэширование реализуется путем сериализации данных и записи их в файл, при этом файл обычно имеет "необычное" название (обычно хэш ключа, т.е. его название не указывает на его содержание).
Для чтения кэша читается весь файл и десереализуется, после этого возвращается значение.

Я немного не понял:
1. Для чего кэш файлу с сериализованными данными давать такое название? Ведь это занимает время для работы с классом, необходимо высчитать хэш строки.

2. Зачем вообще сериализовывать данные? Почему нельзя создать .php файл с именем ключа, переменной внутри которая будет хранить нужные данные, а для чтения просто подключать файл (require) и получать эту переменную? Все будет работать быстрее, т.к. не надо будет высчитывать хэш ключа, не надо будет тратить время на fopen/fread/filesize, не надо будет десереализовывать данные (особенно заметно, если там хранятся масштабные данные, вроде кэша языковых фраз, количество которых измеряется сотнями).

Заранее благодарю за помощь.
_Dark_ Отправлено: 08 Июля, 2012 - 20:56:04 • Тема: Почему не работает? • Форум: Вопросы новичков

Ответов: 13
Просмотров: 325
armancho7777777 пишет:
Bio man, зачем элементы формы?
Он же по ссылке должен перейти на эту страницу.

Форму то как отправить?
_Dark_ Отправлено: 05 Июля, 2012 - 10:59:01 • Тема: прошу помощи!!! • Форум: Вопросы новичков

Ответов: 27
Просмотров: 959
Телевизор пишет:
да скай нуна просто выключить было ну да ладно, а куда заливали файл - напишите пожлст адрес от корневой дериктории

Skype не Denwer'у мешает, а Apache.
_Dark_ Отправлено: 04 Июля, 2012 - 14:14:41 • Тема: Ошибка в сессиях • Форум: Вопросы новичков

Ответов: 11
Просмотров: 317
Знаете, если появляется такая ошибка, то лучше удалить этот движок.
_Dark_ Отправлено: 04 Июля, 2012 - 08:57:20 • Тема: О разделении данных для пользователей • Форум: Вопросы новичков

Ответов: 2
Просмотров: 122
При инициализации сессии, PHP создает временный файл, в нем хранятся переменные сессии.
Для идентификации пользователя есть два варианта:
1. В cookie пользователю сохраняется его уникальный идентификатор.
2. Если cookie недоступны, идентификатор передается в GET запросе, например,
CODE (htmlphp):
скопировать код в буфер обмена
  1. site.ru? PHPSESSID=d38f6ead93eda0425bd58e672cb1b0af


Временные файлы хранятся в папке /tmp/, но при желании, путь хранения можно изменить.

Поправьте, если я ошибся в чем-либо.

Источник: Документация PHP
_Dark_ Отправлено: 07 Февраля, 2012 - 18:33:29 • Тема: Проблема с регулярным выражением • Форум: Регулярные выражения

Ответов: 1
Просмотров: 119
PHP:
скопировать код в буфер обмена
  1.         if(!preg_match('~^[a-zA-Z0-9а-яА-Я]{1,32}$~', $_POST['name'])) {
  2.             $error .= 'Неверное имя! Разрешены буквы русского и латинского алфавита и цифры. Общая длина - 1 - 32 символа.<br />';
  3.         }

Проблема:
если в строке есть > 2 русских букв, то возвращается ложь.
Допустим:
wajska172 - ok
162617 - ok
hw1271sah - ok
sha6187йцfhs - ok
iushшщз271g - возвращается false.
В чем ошибка?
(Добавление)
Проблему решил добавлением модификатора, указывающего на то, что используется UTF8.
Итого, код регулярки:

PHP:
скопировать код в буфер обмена
  1. if(!preg_match('~^[a-zA-Zа-яА-Я0-9]+$~u', $_POST['name'])) {
  2. $error .= 'Неверное имя! Разрешены буквы русского и латинского алфавита и цифры. Общая длина - 1 - 32 символа.<br />';
  3. }
_Dark_ Отправлено: 07 Октября, 2011 - 19:52:52 • Тема: Cannot modify header information - headers already sent by • Форум: Вопросы новичков

Ответов: 16
Просмотров: 736
Champion пишет:
Ого, не знал. До чего технологии дошли, оказывается)

В любом случае спасибо, за подсказку в буферизации)
Тему можно считать закрытой.
_Dark_ Отправлено: 07 Октября, 2011 - 19:44:08 • Тема: Cannot modify header information - headers already sent by • Форум: Вопросы новичков

Ответов: 16
Просмотров: 736
Champion пишет:
Прочитать не успеют) А если через js, то можно задержку сдлать

Задержку тоже можно указать Улыбка

Страниц (16): В начало « ... 8 9 10 11 12 13 14 [15] 16 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB