За последние 24 часа нас посетили 17663 программиста и 1721 робот. Сейчас ищут 1840 программистов ...

Как передалать мой код?

Тема в разделе "PHP для новичков", создана пользователем NerdRage, 6 июл 2016.

  1. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Добрейший вечерочек. У меня такая проблема - я учился кодить сам, в итоге наговнокодил класс длинной 13 тыщ строк. Хочу вот теперь его как-нибудь красиво распилить. Подскажите как вообще лучше структурировать код, чтобы он меньше нажирал сервер? Я пытался распилить на несколько классов и сложить их в разные файлы, но столкнулся с проблемой - в методе __construct моего класса лежат всякие переменные, которые должны быть доступны во всех классах + там идёт подключение к БД. Как это приодалеть? Знаю что глобальные переменные это плохо. Слышал про нэймспейсы какие-то. Кто-то юзает? В общем, прошу поделиться опытом в создании удобной структуры.

    И ещё у меня пара вопросов по нажористости кода.
    1. Создаёт ли какую-то нагрузку на сервер длинна файла? По идеи, объявление функций, классов и методов никак не трогает их содержимое, и хостинг это напрягать не должно.
    2. У меня есть одна тяжёлая функция, которая иногда роняет сервер с ошибкой "Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted". Переделать её полностью не вариант, потому что я уже сам не понимаю как она работает. Вопрос, собссна - падение происходит потому что там много циклов, или потому что я в этих циклах собираю вывод всей страницы в переменную, а в конце выплёвываю строкой: echo $html ? Что-то даст, если я сразу буду делать echo? Или текст, длинной в страницу, всё-таки не должен так нажирать сервер, и тут дело скорее в циклах?
     
  2. mahmuzar

    mahmuzar Старожил

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

    https://php.ru/manual/language.namespaces.html

    Тебе стоит почитать книжку по ООП, и сразу вопросы как все переделать отпадут.
    .
     
  3. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Я читал Котерова и Костарева. Ну а если в двух словах, как вы делаете? Я с самого начала не стал запариваться - у меня исполняемый файл и файл с функциями. Но потом это всё разрослось.
     
  4. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Эта ошибка возникает от нехватки памяти memory_limit - установите больший объем, либо выставите -1, чтобы решить проблему (желательно выставлять значение мб).
    А вообще желательно видеть, что там за метод и какие объемы у файлов, слово большой ничего не дает, ибо даже не огромный - файлы могут быть размером до 2 гигабайт.
    Ну и конечно же чтение больших файлов нужно осуществлять по строчно или со смещением, а не сразу грузить весь файл.
    Есть очень много статей на эту тему, загугли и оптимизируй свои скрипты, если не хочешь, чтобы мы смотрели и обсирали :)
     
    mahmuzar нравится это.
  5. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Спс, погуглю что за построчно и со смещением. А memory_limit - не вариант, хостинг не даёт поменять. С хостинга я переехать не могу, потому что на нём много всего, включая SSL сертификат. Да и memory_limit это не выход, не правильно это. Не правильно вообще делать так как сделал я - засунул всё в один класс длинной 13 тыщ строк. Хочется уже расти что-ли, но вот как лучше реструктурировать - это вопрос.

    Выкладывать свой спагетти-код целиком не вижу смысла, поэтому, описал просто в двух словах. Я сначала вообще без класса сделал, просто функциями, но потом столкнулся с конфликтом в CMS и функции стали методами одного класса.
     
    #5 NerdRage, 7 июл 2016
    Последнее редактирование: 7 июл 2016
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    :eek::eek::eek: Я в цитату это сообщение возьму.
    --- Добавлено ---
    А наследование классов кто-то отменял :? :D Так же ты можешь просто обьявлять создание объекта в конструкторе, тем самым ты сразу и вызываешь, экземпляр класса и получаешь, доступные переменные из класса конструктора например

    PHP:
    1. Class A {
    2.     public $var;
    3.     public function __construct () {
    4.         $var = 1;
    5.     }
    6. }
    7.  
    8. Class B {
    9.     public function index() {
    10.         $A = new A();
    11.         echo $A->var;
    12.     }
    13. }
    14. // Так можешь делать без наследования и получить все нужные свои переменные таким путём. А ещё есть прекрасное наследование классов где ты получаешь значение переменных и методов, родителя по методу $this->Тут_твоя_переменаня_или_метод
    В общем почитай про ООП там не сложно на самом деле. Ну фишки разные с опытом припрут, я пятый месяц сижу изучаю, и каждый день узнаю что что-то можно сделать ещё круче или ваще обнаруживаю в php какие нибудь крутые фишки, упрощающие жизнь ежедневно сокращаю свой же код :D При чём порой очень сильно :)

    А неймспейсы это ОП, то бишь это круто последний шик так сказать :) Гугли PSR-4 стандарт такой. И плюсом почитай про автозагрузку классов, посмотри что такое composer и тд) в общем где то на форуме я раньше разорялся и орал про эти стандарты уж не знаю остались ли сообщения.

    а так вот читай про автозагрузку классов, но сначала почитай в мане по namespace кстате, в отличии всего я по ману изучил пространство имён, и далось оно не сложно :)

    а про автозагрузку здесь

    Клац сюда
     
  7. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Погуглю, спс. Но это вроде оно?
    PHP:
    1. class A {
    2.     function __construct() {
    3.         $var = 1;
    4.     }
    5. }
    6.  
    7. class B extends A {
    8.     function do_stuff() {
    9.         echo $var; // 1
    10.     }
    11. }
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @NerdRage дай код куда нибудь на гитхаб или ещё куда нибудь, позырить что это за ад на 13 к строк :)
     
  9. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    @askanim не могу, проект коммерческий.) Ну то есть сначала был не коммерческий, а спустя год стал приносить деньги.
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @NerdRage

    PHP:
    1. class A {
    2.    public $var;
    3.     public function __construct() {
    4.         $this->var = 1;
    5.     }
    6. }
    7. class B extends A {
    8.  
    9.     public function __construct() {
    10.          parent::__construct(); // Обязытельно при наследовании если ты хочешь получить конструктор наследуемого класса.
    11.     }
    12.     public function do_stuff() {
    13.         echo $this->var; // 1
    14.     }
    15. }
    Вот так правильно посмотри различия не забывай ключевые слова перед определением функций в классах существует три вида protect private и public почитай про ООП
    --- Добавлено ---
    @NerdRage Хах смотри сам :) но сомневаюсь что 13 к строк кода надо кому изучать, я просто бы глянул на первые 100 и понял что там дальше за структура:)

    Но ты давай на ООП переходи и на стандарт psr-4 и ещё, почитай про проектирование MVC
     
    NerdRage нравится это.
  11. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Я читал про это, но не понял какой от этого профит. Public я никогда не ставлю, потому что все методы и так по-умолчанию public.
     
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    клац сюда


    Это на изучение тебе по ООП тип хорошо объясняет. Ну я когда-то смотрел, и начинал по его видосам. Но про стандарт PSR-4 почитай. У него по старому сделано.
    --- Добавлено ---
    без public не работают вообще вроде, в классах то есть без ключевых слов. Какая версия php ?
     
    Avenax и NerdRage нравится это.
  13. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    @askanim
    5.3, у меня всё работает. Может в более поздних версиях это требуется. Надо почитать.
     
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    у меня вообще не работает вызов обычных функций в классах 5,6 версия, он ругается на них
     
  15. mahmuzar

    mahmuzar Старожил

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

    https://secure.php.net/manual/language.oop5.visibility.html
     
  16. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mahmuzar

    што то странное всё работает, значит у меня просто где то была ошибка... Я ошибся бред написал.
     
  17. Avenax

    Avenax Активный пользователь

    С нами с:
    27 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    Спасибо за ссылочку
     
  18. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    В php ООП работает медленее процедур, для некоторых объемных алгоритмов, стоит юзать процедурный подход.
     
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    эммм..... смотря как ты код напишешь. Если тебе нужна одна функция и всё и больше тебе ни каких операций делать не надо, то наверно да. А вот если у тебя целое веб приложение, то в топку процедурное.
    --- Добавлено ---
    Всегда пожалуйста :D
    --- Добавлено ---
    @rodent90 значит алгаритм не верен если он у тебя объёмен и не разделён, на методы, если у тебя куча кода много длинного раздели на методы на под задачи, и вызывай их в нужное время. или не вызывай. а в процедурном программировании, ты будешь прогружать ёлки все абсолютно функции имеющиеся. Как то звучит не чётко грузить сразу 13к строк кода.
    --- Добавлено ---
    @rodent90 Вообще зачем придумали ООП. Чтобы собирать не кучу одинаковых функций, только потому что у них различается пара параметров, а сделать конструктор по которому ты будешь собирать их. И всё. Оно преднозначено само по себе для упрощения все жизни. А ты пытаешься человека на век назад отправить тебе норм ? давай не будем ездить на машине много бензина кушает, будем пешком ходить.
     
    romach нравится это.
  20. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    ООП служит для иерархии и структуры классов и взаимодействие объектов, методов, свойств - это придумали для того, чтобы упростить жизнь программиста.
    Встроенные функции в языке работают быстрее чем дергать классы и создавать объекты и только потом вызывать необходимые методы или свойства, константы.
    Чем просто вызов пользовательской функции или чем лучше сразу встроенной.
    Я хоть и тоже использую классы, ну я стараюсь не плодить и не писать миллионы строк.
    У пыхточнка немного не ООП, в семерочке хоть и есть фишки, но все равно, все сводится к статики.
     
  21. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Если верить книжке, что я читал, то объявление функции не есть прогрузка её содержимого. То есть, при объявлении класса, PHP просто прогружает названия всех методов из этих 13к строк, а каждую строку кода.
     
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Код (Text):
    1. Object method:
    2. 9.1918110847473
    3. Static method:
    4. 8.7962818145752
    5. Function:
    6. 8.0602550506592
    Тупо вызов, на сто миллионов итераций получили таки секунду разницы. И? В реальном проекте это будет чуть меньше погрешности ) А вот правильная композиция кода, позволяющая не биться головой об стену через месяц стоит гораздо больше, чем экономия на спичках.
     
  23. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    По теме:

    1. Запастись данными для тестов, берем n входящих данных, прогоняем то что есть, получаем n результатов.
    2. Открываем портянку идем в самую глубокую вложенность и начинаем её раскручивать создавая функции с нормальным наименованием:
    Код (Text):
    1. определяюПолПользователя();
    2. считаюСколькоВолосНаГолове();
    3. ...
    3. Заменяем куски когда на вызов функции: передаем ей параметры, получаем результат, идем дальше.
    4. Функции эти разносим по разным файликам согласно их назначению:
    Код (Text):
    1. Голова.пхп:
    2. считаюСколькоВолосНаГолове();
    3. определяюЦветГлаз();
    4.  
    5. Руки.пхп
    6. считаюКоличествоРук();
    7. определяюРадиусКривизны();
    5. Повторяем пункты 2-4, пока от файлика не останется лишь общий алгоритм, глядя на который можно понять что вообще происходит.
    6. Тестируем, что бы ничего не отвалилось в процессе.

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

    p.s. таки да, портянка кода будет работать быстрее (при условии, что не найдется куча лишних действий и циклов). Но стоит ли оно того? Что делать, если нужно будет изменить логику работы? Тут никакой скилл не поможет, только взять и переписать.
     
    askanim нравится это.
  24. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    чушь, бред. Читай что такое понятие ООП.
     
  25. mahmuzar

    mahmuzar Старожил

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