За последние 24 часа нас посетили 51300 программистов и 1758 роботов. Сейчас ищут 2017 программистов ...

Include и классы в РНР

Тема в разделе "Прочие вопросы по PHP", создана пользователем Dissonance, 20 июн 2015.

  1. Dissonance

    Dissonance Новичок

    С нами с:
    20 июн 2015
    Сообщения:
    4
    Симпатии:
    0
    Коллеги,

    Постоянно сталкиваюсь с такой проблемой: есть два файла, в каждом по одному классу. В основной странице вызываю инклудами оба файла - всё ок. Но перебрасывать данные из класса в класс хочется и внутри этих файлов. Но тогда надо следить, какой файл с классами вызывается первым в основном файле и рано или поздно путаешься и начинается ошибка переопределения класса.
    Кроме того, работая в редакторах, которые подсвечивают переименные и методы класса (то есть при инклуде видят другой файл и помогают) попадаешь на то, что поскольку в файле с классом ты не вызываешь другой файл с классом, то редактор не видит второго файле и не может подсвечивать.

    Та же проблема и с <meta charset="utf-8">
    Приходится пихать эту строку во все файлы, чтобы не случились иероглифы, в итоге на основной странице если посмотреть source, видно штук 5 таких строк.
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  3. Dissonance

    Dissonance Новичок

    С нами с:
    20 июн 2015
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за ответ. Пока не могу понять про namespace как это спасёт меня в моём случае.
     
  4. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    Если я вас правильно понял.
    Хочется спросить для какой цели перебрасывать данные из класса в класс?
    зачем грузить 2 класса?
    теперь об __autoload предположим вы пытаетесь создать обьект от класса
    Код (PHP):
    1. $ob = new name_class(); 
    2.  
    если php не находит в вашем коде класс name_class то php пытается найти функцию
    __autoload и если ана есть (вы ее должны описать) то он ее вызовит
    Код (PHP):
    1. function __autoload($name){    
    2.   include '$name.php';
    3. }
    4.  
    и будит вам счастье

    Добавлено спустя 2 минуты 42 секунды:
    а на счет namespace яб хотел уточнить у mahmuzar или других . я наверное забыл ,но это поможет в случай если все классы висят в памяти?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    amir_Mirov, namespace я предложил чтобы не было путаницы в коде. Конечно автолоада не будет, я кстати тоже обращался с подобным вопросом, и как автор столкнулся с подобной проблемой конфликта. При том , если использовать namespace IDE видит классы.
     
  6. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    спасибо
    об этом незнал. да и про namespace не особо незнаю. но пологаю namespace работают когда классы загруженны в память ?
     
  7. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Код (PHP):
    1. $a = new \my1\MyClass;
    2. $b = new \my2\MyClass; 
    http://php.net/manual/ru/language.namespaces
     
  8. Dissonance

    Dissonance Новичок

    С нами с:
    20 июн 2015
    Сообщения:
    4
    Симпатии:
    0
    Коллеги,

    Попробовал советы...Для тех кто в танке, помогите понять.
    Попробовал автолод - избавился от инклудова, классы сами загружаются, классно!
    Но! У меня по ходу сама логика неправильная....Вот у меня есть класс class_sqlWork, он занимается работой с БД. И у меня есть класс class_User. Он занимается операциями над пользователями.

    В основной программе я вызываю метод класс class_User, который проверяет авторизован ли пользователь на что-нибудь. Тогда улассу class_User нужно залезть в БД и проверить кое-что (ну является ли пользователь админом и так далее), соответственно мне надо из этого класса вызвать класс class_sqlWork (чтобы пролезть в БД).

    Раньше я как делал...все операции и логика в основном файле а из класса класс не вызывал, но тогда встаёт другая проблема. Предположим у нас класс отрисовывает таблицу в зависимости от того, является ли пользователь админом. Получалось так, в class_sqlWork запрашивались данные и кидались в класс class_BuildData, который рисовал в зависимости оттого, что получал. Но это крайне сужает область применимости методов, сами понимаете.

    Добавлено спустя 24 минуты 26 секунд:
    Более того:
    Autoload приводит к тому что Редактор не видит задействованные классы. Вы в чём программируете?
     
  9. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    Я например не понимаю чем тут сужается область применимости методов.вам что то мешает применить какой - то метод?
    Раскройте вопрос иначе.
    касаемо редакторов я использую notepad++ Phpstorm изучаю php чуть больше года.
    Редактор - средство, вы должны знать где какие классы у вас грузятся без редактора.
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну подсказки очень сильно помогают
     
  11. Dissonance

    Dissonance Новичок

    С нами с:
    20 июн 2015
    Сообщения:
    4
    Симпатии:
    0
    Смотрите: в основном файле стоит автолодер, в файле первого класса вызываем метод из второго класса. В реальности работать будет, но при написании программы, когда вы нопишете $a = new someClass; у вас название класса не подсветится. Когда вы начнёте писать $a-> селектор не покажет меню с доступными классами, значит вам надо будет каждый раз писать заново имя метода - ошибиться очень легко.
    Сейчас когда я перебрасываю переменные из класса в класс в основном файле (при отключенном автолодере и включенных инклудах классов) как только я ставлю первую букву, редактор показывает меню с выбором доступных классов. Количество ошибок снижается в разы.
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Знать где и что конечно хорошо, но когда проект растягивается на длительное время или возвращаешься после перерыва в несколько месяцев вспомнить где и какие классы подключаются и что там есть нереально. Потому в реальности люди используют IDE в которых все прекрасно подсвечивается, показывается, анализируется, находится где используется, от чего зависит и куча других ништяков. А нотепады в топку.
     
  13. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    Хорошо и нужно знать где и что у тебя лежит ! Особенно на первых порах. и понимать эти "ништяков " как дополнительный инструмент.
    Когда проект растягивается я не думаю , что должны возникать вопросы о том как построить правильную логику.
    Но если-же он(проект) всет-ки растягивается и появляются еще куча проектов.то тут я считаю должна помогать логика построения любого проекта - проект должен быть понятен. это в первую и самую главную очередь. а потом уже нужно пологатся на ide.
    а по поводу notepad++ ваше сообщение в нужно в топку.
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    посоветовал же тебе я и кое кто еще, используй namespace
     
  15. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    Незнал будут сплывать подсказки решил проверить, все отрабатывает на ура.
    ПОгнали: создадим 5 файлов +1 папку(class)
    index.php
    Код (PHP):
    1. <?php
    2. if(true)
    3.     require_once "welcom.php";
    4. else{
    5.     require_once "404.php";
    6. }
    7.  
    8. ?>
    welcom.php
    Код (PHP):
    1. <?php
    2. if(ture){
    3.     require_once('class/a.php');
    4.     require_once('class/b.php');
    5.     require_once('class/c.php');
    6.  
    7. }else{
    8.     require_once('welcom_admin.php');
    9.  
    10. }
    11. $ob = new c();
    12. $ob->call_parent_fun();
    13. echo $ob->user;
    14. //метод был добавлен  из доступных методов
    15. //свойство(поле) было добавленно из доступных свойств(полей)
    16. ?>
    class/a.php
    Код (PHP):
    1. <?php
    2. class a{
    3.     function index(){
    4.         echo 'Welcom user';
    5.     }
    6. }
    7.  
    class/b.php
    Код (PHP):
    1. <?php
    2. class b extends a{
    3.     function call_parent_fun(){
    4.         parent::index();
    5.         // обращаемся к методу index  из класса А
    6.     }
    7. }
    8. ?>
    class/c.php
    Код (PHP):
    1. <?php
    2. class c extends b{
    3.     public $user;
    4.     function index(){
    5.         parent::call_parent_fun();
    6.             // обращаемся к методу index из класса А  через класс b используя метод call_parent_fun()
    7.     }
    8. }
    9. ?>
    Добавлено спустя 18 минут 42 секунды:
    я кажется вам написал относительно __autoload()
    если php не находит в вашем коде класс name_class то php пытается найти функцию
    __autoload и если ана есть (вы ее должны описать) то он ее вызовит

    Хорошо давайте я зделаю это за вас:
    Добавим еще 1 файл и отредактируем welcom.php
    class/x.php
    Код (PHP):
    1. <?php
    2. class x {
    3.     function yuo_look_me(){
    4.         echo 'Как так:?';
    5.     }
    6. }
    7. ?>
    redact: welcom.php
    Код (PHP):
    1. <?php
    2. if(ture){
    3.     require_once('class/a.php');
    4.     require_once('class/b.php');
    5.     require_once('class/c.php');
    6.  
    7. }else{
    8.     require_once('welcom_admin.php');
    9.  
    10. }
    11. $ob = new c();
    12. $ob->call_parent_fun();
    13. echo $ob->user;
    14. // функция вышла из доступных функций
    15. function __autoload(){
    16.     require_once('class/c.php');
    17.  
    18. }
    19. $object = new x();
    20. $object->yuo_look_me()
    21. // и это тоже  выскачило вдруг ? наверное IDE Глючит!!!
    22.  
    23. ?>
    IDE IDE .... Х это ! если вы без него работать не умеете. научитесь писать код в notepadd++ набейте шишки это будит самый лутшии опыт.а потом ide будит отличным помощником.
     
  16. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    ))

    Добавлено спустя 31 секунду:
    бро, научись пользоваться нормальной IDE

    Добавлено спустя 1 минуту 5 секунд:
    я сови шишки набил на notepad++ мне хватило. А namespace к этому отношения не имеет. И про автолоад я ничего не писал.

    Добавлено спустя 2 минуты 4 секунды:
    Код (PHP):
    1. <?php
    2. if(ture){ 
    а зачем так писать?
     
  17. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    я обращался к автору. данного топика.вам я только задавал вопрос относительно namespace в свойх интересах , выше.
    а как написать?

    Добавлено спустя 1 минуту 20 секунд:
    с чего вы зделали вывод что мне стоит учится этому?
    нормальное ide что это в вашем понимании?
     
  18. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    просто я пока полноценно не научился пользоваться ею. Поэтому посоветовал, харкорить на notepad хорошо, но лучше перейти уже на иде.
    у тебя ж else часть никогда не выполнится
     
  19. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    если вы в целом посмотрите почему и для чего я написал весь этот код. то я думаю данный вопрос отпадет.
    По большому счету notepadd++ = редактор (без подключенной к нему IDE) и любой другой по вашему IDE тоже является редактором с готовым подключенным (IDE), IDE Integrated development environment - система программных средств.
    так что весь этот балаган бесполезен. Так как к тому-же Notepad можно подключить IDE.
    Автору нужно учить язык понять его а потом уже думать об IDE.
    IDE - допускает имя функций(метода) fgdgfgdfgfdgdfgdfgdfgdfgfdg такого вида - это допущение новичку дает не правильно понимание КАК писать код. и код становится грязным и не понятным .могу продолжить . но посыл задуматся я думаю дал . и кто в теме тот меня поймет.
     
  20. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    amir_Mirov, я понимаю что ты недавно америку открыл, но все делается не так )) И лучше сначала избавься от каши в голове, а потом уже рассказывай новичкам о том как писать код. if(ture){ блин ))
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А нотпад умен и отказывается сохранять файлы с такими именами? Что за бред?
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    [​IMG]
    если воспользоваться этой возможностью IDE, то будут подсвечиваться все классы из указанных директорий
     
  23. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    Знаете ув форумчани сидеть и дергать что то из контекста.
    Например:
    я написал об IDE при чем тут Notepad ? если Разработчик создаст класс с таким именнем - ему не нужно думать о том как потом понимать что это за класс и как ручками его прописать чтобы не было ошибки. он его дернит в помощью IDE.
    Мне казалось вы компитентный - ибо я не понимаю как можно что то не понять и назвать это бредом.Я написал что нотепад сохранит? не писал я этого! вы за уши притинули суда свое высказывание - которое не имеет не какого обьективного основания.
    Я считаю ваше высказывание "но все делается не так " как минимум должно быть подкрепленно каким-то обоснованием.
    И по большому счету судя по вашим сообщениям- я четко понимаю что к вам точно прислушиватся не нужно!

    Специально для вас я приведу пример:
    В чем каша? - исходя из чего вы позволяете себе такое высказывание поясните !
    И вообще с чего вы взяли что вы можете мне писать ? обращаясь ко мне на ты?
    Это форум и это нужно учитывать ! И не вам говорить мне что мне кому и как рассказывать.
    А если ваш светлый ум поситит идея тролить меня дальше . да да именно так я вас васпринемаю.
    То постарайтесь зделать это как минимум обоснованным и в рамках понятия форум
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    спокойно! в интернете всегда кто-то неправ.
     
  25. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Ну так не прислушивайся, какие проблемы то? А лучше скажи, какая связь между нэймспейсами, классами висящими в памяти, нотепадом, иде, автолоадом и качеством кода? Я вот не понял связи )

    Вот кстати пример реализации.