Добрейший вечерочек. У меня такая проблема - я учился кодить сам, в итоге наговнокодил класс длинной 13 тыщ строк. Хочу вот теперь его как-нибудь красиво распилить. Подскажите как вообще лучше структурировать код, чтобы он меньше нажирал сервер? Я пытался распилить на несколько классов и сложить их в разные файлы, но столкнулся с проблемой - в методе __construct моего класса лежат всякие переменные, которые должны быть доступны во всех классах + там идёт подключение к БД. Как это приодалеть? Знаю что глобальные переменные это плохо. Слышал про нэймспейсы какие-то. Кто-то юзает? В общем, прошу поделиться опытом в создании удобной структуры. И ещё у меня пара вопросов по нажористости кода. 1. Создаёт ли какую-то нагрузку на сервер длинна файла? По идеи, объявление функций, классов и методов никак не трогает их содержимое, и хостинг это напрягать не должно. 2. У меня есть одна тяжёлая функция, которая иногда роняет сервер с ошибкой "Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted". Переделать её полностью не вариант, потому что я уже сам не понимаю как она работает. Вопрос, собссна - падение происходит потому что там много циклов, или потому что я в этих циклах собираю вывод всей страницы в переменную, а в конце выплёвываю строкой: echo $html ? Что-то даст, если я сразу буду делать echo? Или текст, длинной в страницу, всё-таки не должен так нажирать сервер, и тут дело скорее в циклах?
память закончилась! https://php.ru/manual/language.namespaces.html Тебе стоит почитать книжку по ООП, и сразу вопросы как все переделать отпадут. .
Я читал Котерова и Костарева. Ну а если в двух словах, как вы делаете? Я с самого начала не стал запариваться - у меня исполняемый файл и файл с функциями. Но потом это всё разрослось.
Эта ошибка возникает от нехватки памяти memory_limit - установите больший объем, либо выставите -1, чтобы решить проблему (желательно выставлять значение мб). А вообще желательно видеть, что там за метод и какие объемы у файлов, слово большой ничего не дает, ибо даже не огромный - файлы могут быть размером до 2 гигабайт. Ну и конечно же чтение больших файлов нужно осуществлять по строчно или со смещением, а не сразу грузить весь файл. Есть очень много статей на эту тему, загугли и оптимизируй свои скрипты, если не хочешь, чтобы мы смотрели и обсирали
Спс, погуглю что за построчно и со смещением. А memory_limit - не вариант, хостинг не даёт поменять. С хостинга я переехать не могу, потому что на нём много всего, включая SSL сертификат. Да и memory_limit это не выход, не правильно это. Не правильно вообще делать так как сделал я - засунул всё в один класс длинной 13 тыщ строк. Хочется уже расти что-ли, но вот как лучше реструктурировать - это вопрос. Выкладывать свой спагетти-код целиком не вижу смысла, поэтому, описал просто в двух словах. Я сначала вообще без класса сделал, просто функциями, но потом столкнулся с конфликтом в CMS и функции стали методами одного класса.
Я в цитату это сообщение возьму. --- Добавлено --- А наследование классов кто-то отменял :? Так же ты можешь просто обьявлять создание объекта в конструкторе, тем самым ты сразу и вызываешь, экземпляр класса и получаешь, доступные переменные из класса конструктора например PHP: Class A { public $var; public function __construct () { $var = 1; } } Class B { public function index() { $A = new A(); echo $A->var; } } // Так можешь делать без наследования и получить все нужные свои переменные таким путём. А ещё есть прекрасное наследование классов где ты получаешь значение переменных и методов, родителя по методу $this->Тут_твоя_переменаня_или_метод В общем почитай про ООП там не сложно на самом деле. Ну фишки разные с опытом припрут, я пятый месяц сижу изучаю, и каждый день узнаю что что-то можно сделать ещё круче или ваще обнаруживаю в php какие нибудь крутые фишки, упрощающие жизнь ежедневно сокращаю свой же код При чём порой очень сильно А неймспейсы это ОП, то бишь это круто последний шик так сказать Гугли PSR-4 стандарт такой. И плюсом почитай про автозагрузку классов, посмотри что такое composer и тд) в общем где то на форуме я раньше разорялся и орал про эти стандарты уж не знаю остались ли сообщения. а так вот читай про автозагрузку классов, но сначала почитай в мане по namespace кстате, в отличии всего я по ману изучил пространство имён, и далось оно не сложно а про автозагрузку здесь Клац сюда
Погуглю, спс. Но это вроде оно? PHP: class A { function __construct() { $var = 1; } } class B extends A { function do_stuff() { echo $var; // 1 } }
@askanim не могу, проект коммерческий.) Ну то есть сначала был не коммерческий, а спустя год стал приносить деньги.
@NerdRage PHP: class A { public $var; public function __construct() { $this->var = 1; } } class B extends A { public function __construct() { parent::__construct(); // Обязытельно при наследовании если ты хочешь получить конструктор наследуемого класса. } public function do_stuff() { echo $this->var; // 1 } } Вот так правильно посмотри различия не забывай ключевые слова перед определением функций в классах существует три вида protect private и public почитай про ООП --- Добавлено --- @NerdRage Хах смотри сам но сомневаюсь что 13 к строк кода надо кому изучать, я просто бы глянул на первые 100 и понял что там дальше за структура Но ты давай на ООП переходи и на стандарт psr-4 и ещё, почитай про проектирование MVC
Я читал про это, но не понял какой от этого профит. Public я никогда не ставлю, потому что все методы и так по-умолчанию public.
клац сюда Это на изучение тебе по ООП тип хорошо объясняет. Ну я когда-то смотрел, и начинал по его видосам. Но про стандарт PSR-4 почитай. У него по старому сделано. --- Добавлено --- без public не работают вообще вроде, в классах то есть без ключевых слов. Какая версия php ?
@mahmuzar што то странное всё работает, значит у меня просто где то была ошибка... Я ошибся бред написал.
В php ООП работает медленее процедур, для некоторых объемных алгоритмов, стоит юзать процедурный подход.
эммм..... смотря как ты код напишешь. Если тебе нужна одна функция и всё и больше тебе ни каких операций делать не надо, то наверно да. А вот если у тебя целое веб приложение, то в топку процедурное. --- Добавлено --- Всегда пожалуйста --- Добавлено --- @rodent90 значит алгаритм не верен если он у тебя объёмен и не разделён, на методы, если у тебя куча кода много длинного раздели на методы на под задачи, и вызывай их в нужное время. или не вызывай. а в процедурном программировании, ты будешь прогружать ёлки все абсолютно функции имеющиеся. Как то звучит не чётко грузить сразу 13к строк кода. --- Добавлено --- @rodent90 Вообще зачем придумали ООП. Чтобы собирать не кучу одинаковых функций, только потому что у них различается пара параметров, а сделать конструктор по которому ты будешь собирать их. И всё. Оно преднозначено само по себе для упрощения все жизни. А ты пытаешься человека на век назад отправить тебе норм ? давай не будем ездить на машине много бензина кушает, будем пешком ходить.
ООП служит для иерархии и структуры классов и взаимодействие объектов, методов, свойств - это придумали для того, чтобы упростить жизнь программиста. Встроенные функции в языке работают быстрее чем дергать классы и создавать объекты и только потом вызывать необходимые методы или свойства, константы. Чем просто вызов пользовательской функции или чем лучше сразу встроенной. Я хоть и тоже использую классы, ну я стараюсь не плодить и не писать миллионы строк. У пыхточнка немного не ООП, в семерочке хоть и есть фишки, но все равно, все сводится к статики.
Если верить книжке, что я читал, то объявление функции не есть прогрузка её содержимого. То есть, при объявлении класса, PHP просто прогружает названия всех методов из этих 13к строк, а каждую строку кода.
Код (Text): Object method: 9.1918110847473 Static method: 8.7962818145752 Function: 8.0602550506592 Тупо вызов, на сто миллионов итераций получили таки секунду разницы. И? В реальном проекте это будет чуть меньше погрешности ) А вот правильная композиция кода, позволяющая не биться головой об стену через месяц стоит гораздо больше, чем экономия на спичках.
По теме: 1. Запастись данными для тестов, берем n входящих данных, прогоняем то что есть, получаем n результатов. 2. Открываем портянку идем в самую глубокую вложенность и начинаем её раскручивать создавая функции с нормальным наименованием: Код (Text): определяюПолПользователя(); считаюСколькоВолосНаГолове(); ... 3. Заменяем куски когда на вызов функции: передаем ей параметры, получаем результат, идем дальше. 4. Функции эти разносим по разным файликам согласно их назначению: Код (Text): Голова.пхп: считаюСколькоВолосНаГолове(); определяюЦветГлаз(); Руки.пхп считаюКоличествоРук(); определяюРадиусКривизны(); 5. Повторяем пункты 2-4, пока от файлика не останется лишь общий алгоритм, глядя на который можно понять что вообще происходит. 6. Тестируем, что бы ничего не отвалилось в процессе. Как превратить это в ООП - разговор отдельный, ибо это не классы / объекты / методы, а логика, паттерны и структуры, детали которых зависят не только от задачи, но и от понимания того, кто будет это делать. p.s. таки да, портянка кода будет работать быстрее (при условии, что не найдется куча лишних действий и циклов). Но стоит ли оно того? Что делать, если нужно будет изменить логику работы? Тут никакой скилл не поможет, только взять и переписать.