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 :: подключение класса [2]
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
soffrick
Чую сарказм ) тогда исправляй )
привет... тебя ведь не должно здесь быть
esterio
Отправлено: 01 Августа, 2013 - 13:43:33
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
teddy
не согласен. Подключить файл нужно. Но создавать его екземпляр не всегда. Ну и global scope также плохо.
Если уж зашла речь как кто делает. То у меня есть автолоадер, который имеет конфиг где какой класс лежит. При создании екземпляра(в случае если класс не подгружен) он автоматически загрузиться и создастся екземпляр. Таким способом я имею полностю контроль над процесамы в приложении. думаю не я один так делаю.
teddy
Отправлено: 01 Августа, 2013 - 13:54:23
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
caballero пишет:
даже близко не одно и тоже
А почему не одно и то же? Мы ведь подключаем файл с классом для того что бы с ним как то работать(подразумевается обязательное создание объекта).
Говорить можно всякое, а вот объяснить никто не объясняет...
Не понимаю такого хода.
esterio
Ну каждому свое ) если файлов много то согласен автолод может пригодится очень даже. Но тут ТС нужно просто принцип объяснить что бы он на практике увидел как это все работает, я так сказал не ради того что бы выявить какой вариант лучше ) Согласитесь если начать здесь говорить ещё и про статические методы тогда ТС вообще запутается... он пока только-только изучает как создаются классы
П:С я не считаю что вот я так ошибся очень-очень сильно и что за это меня нужно расстрелять ) Работать будет и так и так... вопрос в том какая стоит задача
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
teddy
Имеено так как Вы сказали делать не нужно в 99% случаев. Поетому такая критика в вашу сторону. Создавать екземпляр нужно только там где он нужен.
DeepVarvar
Отправлено: 02 Августа, 2013 - 00:13:07
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Даже если инклюд файла с классом, или даже несколькими классами в одном файле, происходит черт-те знает где, в любом месте кода, в любом приватном методе любого класса - все классы описанные в подключаемом файле становятся доступными в глобальном скопе (если только не используется неймспейсинг).
Это же утверждение равносильно и для обычных функций.
Переменные же или свойства объектов остаются только в том скопе, в ктором были объявлены.
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
DeepVarvar пишет:
Переменные же или свойства объектов остаются только в том скопе, в ктором были объявлены.
Добавлю что все пременные внутри include/require имеют ту же область видимости откуда они вызваны. как-то так
teddy
Отправлено: 02 Августа, 2013 - 00:58:17
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
esterio
Ок я не буду спорить но почему мне никто не говорит почему так делать не нужно?
Тоесть я уже прежде написал, что если не создать объект, то не будет вызван конструктор, как по мне то лучше тогда просто обычную функцию написать. Хотя здесь опять же вопрос появляется - кому как удобно.. Кому то просто удобно рассматривать класс как чертеж поэтому он в любом случае создаст класс...
esterio пишет:
Создавать екземпляр нужно только там где он нужен.
А в чем разница? Прошу понять правильно, я не чтоб поспорить, а что бы уловить разницу т.к мне самому интересно...
Так вот... зачем в плохом примере вызван session_start() в середине кода(ведь и так все будет работать) а в хорошем на мой взгяд примере session_start() вызван в начале кода? Ведь работать будет и так и так. Если думать с такой же логикой, то в начале session_start не нужен а нужен в середине кода. Но рекомендуют писать его в начале кода.
Поэтому я думаю что здесь тоже так... т.е если что то будет использоваться в дальнейшем, в данном случае объект, то почему не подготовить его заранее? Вроде логично. В жизни тоже так, мы хотим куда то сходить и по возможности готовимся заранее...
Одно дело объект лежит где то в коде а другое дело все расставлено по полочкам. Вдруг я в дальнейшем хочу расширять своей проект и новый модуль должен будет использовать тот же класс и я хочу использовать новый код в самом начале страницы - мне тогда придется перенести созданный объект в начало кода что не есть хорошо. А тут один раз написали и расширяться можно спокойно и не искать в коде объект что бы его переставить. Как то так
Опять же повторюсь, я ничего не утверждаю, спрашиваю что бы понять что я сказал не так...
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
teddy, ну ты спор завел вообще на пустом месте (я про инстанцирование класса в файле с классом)
1. Используя такую конструкцию, я должен помнить что там в фле есть какая-то переменная, содержащая объект данного класса.
2. А если мне нужно несколько объектов, их тоже все инстанцировать там?
3. Как будет работать автолоад? я напишу (учитывая, что $db объявлена в файле с классом)
$db->query();
и словлю фатал-эррор, потому что файл не подключен и переменная не объявлена. тогда как в случае
$db = new DB();
$db->query();
сработает автолоад класс подключится и все будет чики пуки.
4. Программисту, который будет поддерживать такой код лучше не сообщать свои контакты
продолжать?.. (Добавление) him, у вас тоже проблема раздута из ничего (откуда столько комментариев только )
Если у вас много классов (да даже если и не много), оптимальный выход - написать автолоадер и не парится с подключением файлов.
По поводу выбора языковой конструкции - особой разницы нет что использовать include или require. Отличие только в том, что первая в случае отсутствия файла выдаст ворнинг, вторая - фатал. Предположив, что выполнение программы в принципе невозможно при отсутствии класса, можно остановить свой выбор на require (но в любом случае стоит проверить существование файла перед инклудом).
_once или не _once?
тут тоже все просто. Повторное объявление класса (или функции) выдаст фатальную ошибку, поэтому для подключения классов или библиотек с функциями используем *_once. А если вы подключаете шаблон в шаблонизаторе - очевидно, что он по логике может быть вызван несколько раз, тут используем конструкции без _once.
Вот, собственно и все.
----- Чем больше узнаю, тем больше я не знаю.
teddy
Отправлено: 02 Августа, 2013 - 01:39:29
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DelphinPRO
Так я же говорил что не поспорить хочу а спросить, что я сказал не так... ) Здесь ведь нет ничего такого... что плохого в том что я выражаю свою точку зрения и не против прислушаться к более опытным... Вот если к примеру меня здесь не исправили бы, я бы и дальше думал что так делать правильно... Общение на форуме для меня своего рода практика... Каждый может ошибиться или чего то не понять, не все же всегда всё знали... Когда то каждого профи кто то исправлял или он просто допускал ошибки. Не понимаю почему люди так резко реагируют на подобные вещи...
Теперь я понял почему так делать не нужно. Спасибо за примеры
caballero
Отправлено: 02 Августа, 2013 - 10:05:17
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
что плохого в том что я выражаю свою точку зрения
ничего плохого на то и форум. Плохо что начинаешь раздавать советы новичкам в тех вопросах что еще сам не разобрался. А человек считает что раз ему ответили на форуме значит ответили знающие люди.
Цитата:
почему мне никто не говорит почему так делать не нужно?
потому что ты не спрашиваешь как нужно делать
Цитата:
т.е если что то будет использоваться в дальнейшем, в данном случае объект, то почему не подготовить его заранее? Вроде логично. В жизни тоже так, мы хотим куда то сходить и по возможности готовимся заранее...
ГОТОВИМСЯ заранее а не ИДЕМ заранее.
готовимся - означает подключаем инклуды или пишем автолоад. А "идем" - это создаем екземпляр класса в том месте что нужно и в то время что нужно. а в других языках програмирования - экземпляр после использования полагается удалить иначе памяти не напасешся.
В этом минус начинать учить програмирование с PHP. Человек не понимает зачем нужны типы данных, зачем нужны конструкторы и деструторы, каков жизненный цикл объекта и зачем за этим следить.
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
caballero пишет:
Плохо что начинаешь раздавать советы новичкам в тех вопросах что еще сам не разобрался.
Ну есть такой момент, только ты упустил кое что. Когда я что то пишу то значит я уверен что я подсказал правильно поэтому и пишу, но если меня исправляют и объясняют почему исправили тогда я могу изменить свое мнение... Да и не всегда я всё говорю неправильно. В данной теме накосячил только с созданием объекта, остальное ведь правильно сказал... Сразу ничего не бывает, всё с опытом приходил и я в этом убедился
caballero пишет:
потому что ты не спрашиваешь как нужно делать
Как не спрашивал? Я и на этой и на первой странице спросил сразу после возражений...
caballero пишет:
экземпляр после использования полагается удалить иначе памяти не напасешся.
Так он же удаляется деструктором автоматически разве не так?
Покинул форум
Сообщений всего: 379
Дата рег-ции: Май 2012 Откуда: Россия, Москва
Помог: 17 раз(а)
teddy пишет:
удаляется деструктором автоматически
----- Правильный вопрос - уже половина правильного ответа!
p.s. индусы повсюду, будьте осторожны!
caballero
Отправлено: 02 Августа, 2013 - 13:34:35
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Так он же удаляется деструктором автоматически разве не так?
деструктор удаляет ресурсы самого объекта которые как правило создаются в конструкторе
например освободить файл и ли или конект к БД или память ( если это сишная программа).
сам деструктор вызывается когда экземпляр удаляется извне, явно или оборщиком мустора.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.