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]

 PHP.SU

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


 Страниц (2): « 1 [2]   

> Без описания
teddy
Отправлено: 01 Августа, 2013 - 13:43:00
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




soffrick
Чую сарказм ) тогда исправляй )
привет... тебя ведь не должно здесь быть Улыбка
 
 Top
esterio
Отправлено: 01 Августа, 2013 - 13:43:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




teddy
не согласен. Подключить файл нужно. Но создавать его екземпляр не всегда. Ну и global scope также плохо.
Если уж зашла речь как кто делает. То у меня есть автолоадер, который имеет конфиг где какой класс лежит. При создании екземпляра(в случае если класс не подгружен) он автоматически загрузиться и создастся екземпляр. Таким способом я имею полностю контроль над процесамы в приложении. думаю не я один так делаю.
 
 Top
teddy
Отправлено: 01 Августа, 2013 - 13:54:23
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




caballero пишет:
даже близко не одно и тоже

А почему не одно и то же? Мы ведь подключаем файл с классом для того что бы с ним как то работать(подразумевается обязательное создание объекта).

Говорить можно всякое, а вот объяснить никто не объясняет...

Не понимаю такого хода.

esterio
Ну каждому свое ) если файлов много то согласен автолод может пригодится очень даже. Но тут ТС нужно просто принцип объяснить что бы он на практике увидел как это все работает, я так сказал не ради того что бы выявить какой вариант лучше ) Согласитесь если начать здесь говорить ещё и про статические методы тогда ТС вообще запутается... он пока только-только изучает как создаются классы

П:С я не считаю что вот я так ошибся очень-очень сильно и что за это меня нужно расстрелять ) Работать будет и так и так... вопрос в том какая стоит задача

(Отредактировано автором: 01 Августа, 2013 - 13:55:48)

 
 Top
esterio
Отправлено: 01 Августа, 2013 - 14:09:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




teddy
Имеено так как Вы сказали делать не нужно в 99% случаев. Поетому такая критика в вашу сторону. Создавать екземпляр нужно только там где он нужен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 02 Августа, 2013 - 00:13:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Даже если инклюд файла с классом, или даже несколькими классами в одном файле, происходит черт-те знает где, в любом месте кода, в любом приватном методе любого класса - все классы описанные в подключаемом файле становятся доступными в глобальном скопе (если только не используется неймспейсинг).
Это же утверждение равносильно и для обычных функций.

Переменные же или свойства объектов остаются только в том скопе, в ктором были объявлены.

Спойлер (Отобразить)
 
 Top
esterio
Отправлено: 02 Августа, 2013 - 00:16:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




DeepVarvar пишет:
Переменные же или свойства объектов остаются только в том скопе, в ктором были объявлены.

Добавлю что все пременные внутри include/require имеют ту же область видимости откуда они вызваны. как-то так
 
 Top
teddy
Отправлено: 02 Августа, 2013 - 00:58:17
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




esterio
Ок я не буду спорить но почему мне никто не говорит почему так делать не нужно?Улыбка
Тоесть я уже прежде написал, что если не создать объект, то не будет вызван конструктор, как по мне то лучше тогда просто обычную функцию написать. Хотя здесь опять же вопрос появляется - кому как удобно.. Кому то просто удобно рассматривать класс как чертеж поэтому он в любом случае создаст класс...

esterio пишет:
Создавать екземпляр нужно только там где он нужен.

А в чем разница? Прошу понять правильно, я не чтоб поспорить, а что бы уловить разницу т.к мне самому интересно...

Сейчас объясню почему я так думаю:
Плохой код:
Спойлер (Отобразить)

Хороший код:
Спойлер (Отобразить)

Так вот... зачем в плохом примере вызван session_start() в середине кода(ведь и так все будет работать) а в хорошем на мой взгяд примере session_start() вызван в начале кода? Ведь работать будет и так и так. Если думать с такой же логикой, то в начале session_start не нужен а нужен в середине кода. Но рекомендуют писать его в начале кода.

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

Одно дело объект лежит где то в коде а другое дело все расставлено по полочкам. Вдруг я в дальнейшем хочу расширять своей проект и новый модуль должен будет использовать тот же класс и я хочу использовать новый код в самом начале страницы - мне тогда придется перенести созданный объект в начало кода что не есть хорошо. А тут один раз написали и расширяться можно спокойно и не искать в коде объект что бы его переставить. Как то так

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

(Отредактировано автором: 02 Августа, 2013 - 01:03:10)

 
 Top
DelphinPRO
Отправлено: 02 Августа, 2013 - 01:25:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




teddy, ну ты спор завел вообще на пустом месте Улыбка (я про инстанцирование класса в файле с классом)

1. Используя такую конструкцию, я должен помнить что там в фле есть какая-то переменная, содержащая объект данного класса.
2. А если мне нужно несколько объектов, их тоже все инстанцировать там?
3. Как будет работать автолоад? я напишу (учитывая, что $db объявлена в файле с классом)
$db->query();
и словлю фатал-эррор, потому что файл не подключен и переменная не объявлена. тогда как в случае
$db = new DB();
$db->query();
сработает автолоад класс подключится и все будет чики пуки.
4. Программисту, который будет поддерживать такой код лучше не сообщать свои контакты Улыбка

продолжать?..
(Добавление)
him, у вас тоже проблема раздута из ничего (откуда столько комментариев только Улыбка )

Если у вас много классов (да даже если и не много), оптимальный выход - написать автолоадер и не парится с подключением файлов.
По поводу выбора языковой конструкции - особой разницы нет что использовать include или require. Отличие только в том, что первая в случае отсутствия файла выдаст ворнинг, вторая - фатал. Предположив, что выполнение программы в принципе невозможно при отсутствии класса, можно остановить свой выбор на require (но в любом случае стоит проверить существование файла перед инклудом).
_once или не _once?
тут тоже все просто. Повторное объявление класса (или функции) выдаст фатальную ошибку, поэтому для подключения классов или библиотек с функциями используем *_once. А если вы подключаете шаблон в шаблонизаторе - очевидно, что он по логике может быть вызван несколько раз, тут используем конструкции без _once.

Вот, собственно и все.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
teddy
Отправлено: 02 Августа, 2013 - 01:39:29
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DelphinPRO
Так я же говорил что не поспорить хочу а спросить, что я сказал не так... ) Здесь ведь нет ничего такого... что плохого в том что я выражаю свою точку зрения и не против прислушаться к более опытным... Вот если к примеру меня здесь не исправили бы, я бы и дальше думал что так делать правильно... Общение на форуме для меня своего рода практика... Каждый может ошибиться или чего то не понять, не все же всегда всё знали... Когда то каждого профи кто то исправлял или он просто допускал ошибки. Не понимаю почему люди так резко реагируют на подобные вещи...

Теперь я понял почему так делать не нужно. Спасибо за примеры
 
 Top
caballero
Отправлено: 02 Августа, 2013 - 10:05:17
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
что плохого в том что я выражаю свою точку зрения

ничего плохого на то и форум. Плохо что начинаешь раздавать советы новичкам в тех вопросах что еще сам не разобрался. А человек считает что раз ему ответили на форуме значит ответили знающие люди.

Цитата:
почему мне никто не говорит почему так делать не нужно?

потому что ты не спрашиваешь как нужно делать

Цитата:
т.е если что то будет использоваться в дальнейшем, в данном случае объект, то почему не подготовить его заранее? Вроде логично. В жизни тоже так, мы хотим куда то сходить и по возможности готовимся заранее...

ГОТОВИМСЯ заранее а не ИДЕМ заранее.

готовимся - означает подключаем инклуды или пишем автолоад. А "идем" - это создаем екземпляр класса в том месте что нужно и в то время что нужно. а в других языках програмирования - экземпляр после использования полагается удалить иначе памяти не напасешся.
В этом минус начинать учить програмирование с PHP. Человек не понимает зачем нужны типы данных, зачем нужны конструкторы и деструторы, каков жизненный цикл объекта и зачем за этим следить.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
teddy
Отправлено: 02 Августа, 2013 - 12:53:17
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




caballero пишет:
Плохо что начинаешь раздавать советы новичкам в тех вопросах что еще сам не разобрался.

Ну есть такой момент, только ты упустил кое что. Когда я что то пишу то значит я уверен что я подсказал правильно поэтому и пишу, но если меня исправляют и объясняют почему исправили тогда я могу изменить свое мнение... Да и не всегда я всё говорю неправильно. В данной теме накосячил только с созданием объекта, остальное ведь правильно сказал... Сразу ничего не бывает, всё с опытом приходил и я в этом убедился

caballero пишет:
потому что ты не спрашиваешь как нужно делать

Как не спрашивал? Я и на этой и на первой странице спросил сразу после возражений...

caballero пишет:
экземпляр после использования полагается удалить иначе памяти не напасешся.


Так он же удаляется деструктором автоматически разве не так?

(Отредактировано автором: 02 Августа, 2013 - 12:54:12)

 
 Top
soffrick
Отправлено: 02 Августа, 2013 - 13:04:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 379
Дата рег-ции: Май 2012  
Откуда: Россия, Москва


Помог: 17 раз(а)




teddy пишет:
удаляется деструктором автоматически

Ха-ха Ха-ха Ха-ха


-----
Правильный вопрос - уже половина правильного ответа!

p.s. индусы повсюду, будьте осторожны!
 
 Top
caballero
Отправлено: 02 Августа, 2013 - 13:34:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Так он же удаляется деструктором автоматически разве не так?

деструктор удаляет ресурсы самого объекта которые как правило создаются в конструкторе
например освободить файл и ли или конект к БД или память ( если это сишная программа).

сам деструктор вызывается когда экземпляр удаляется извне, явно или оборщиком мустора.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB