Добро пожаловать. В этом треде мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию. Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492 ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет. Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Код надо писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults() - Название функции начинается с глагола, в стиле «сделайЧтоТо» - не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там - в именах классов используется CamelCase, первая буква большая, «_» может использоваться - мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
Есть форма для поиска, в поля которой возвращаются значения, указанные при предыдущем поиске (я в прошлом треде еще спрашивал, как это сделать). Но теперь не работает Input type ="reset", точнее, работает, но не очищает значения, а возвращает те, которые были при открытии формы, то есть опять те же самые. Как это обойти?
>>449473 >Оно не работает с русскими символами. Что делать? Вру, все оно там работает, проблема в другом. В массиве чекбоксов значения всегда принадлежат одним и тем же ключам, а в списке с селектами нифига не так, там в зависимости от того, сколько и какие позиции выбраны, поэтому и не совпадает.
А node.js может полностью заменить PHP? Дело в том, что мне надо пилить сайт, а я не знаю ни того, ни того. Но, так как знаю JavaScript, думаю ноду будет выучить проще. Это реально?
>>449402 >Почему исплоьзуешь такой странный способ скрытия? Почему не display none? А как иначе мне их скрывать? Мне ведь нужно, чтобы 4 разных блока были в одном и том же месте, без абсолютной позиции они будут идти друг за другом. Display none ведь не убирает их из общего потока? >Это лучше сделать через классы. Тогда мы можем сделать несколько блоков с табами на странице. Ты имеешь ввиду свой класс для каждого блока?
>>449402 >Кроме переходов (transiotion), в CSS есть покадровая (keyframe) анимация, читал про нее? Надо хотя бы знать что это такое. Я хотел сделать через неё, вместо transitio, но она после проигрыша возвращается в исходное положение. Я не нашел в документации как это исправить.
Ох лол. Не понимаю я их. Сначала говорят мне, что данных, которые я им предоставил недостаточно, а на мой вопрос в сапорт, чего им не хватает молчат. А теперь вот присылают наконец. Не знаю, правда, зачем она мне, но пусть будет.
А, хотя в случае если мы уберем id, мы не сможем связать label и input. Если нет вариантов как убрать id, можешь их оставить.
С id неудобно добавлять несколько блоков с табами, так как ты должен придумывать уникальные id и дописывать их в CSS. БЫло бы хорошо конечно чтобы все это само работало, но я сомневаюсь что это возможно.
Еще помни что добавление или убирание display none убирает переходы. Потому для анимации оно может не подойти. Я тебе скидывал статью, там использовался интересный хак с max-height для скрытия элементов. Не факт конечно что он тебе подойдет.
> нормально исправил, или это на костыль похоже? Не нормально. Ты мог бы поменять <= на < а вместо этого нагородмл переменных. А еще лучше, использовать foreach
Еще вопрос. Как правильно написать функцию которая принимает колбек? Например, как надо написать мою функцию чтобы она вернула массив с нулем? http://ideone.com/JbFbD9
>>449543 Спасибо. Но тут проблема с записью комментов пока, лол. Короче, суть такова: на страничке вызывается инклюдом форма для добавления коммента, откуда через POST данные передаются в action.php, который, собственно, и добавляет коммент в базу и через header("Location: /page.php?id="); переходит опять на первоначальную страничку. Во-первых, не могу понять, как передать родительский айди (то есть к какой страничке относится коммент). В форму вставить какой-нибудь неотображаемый элемент, приравненый этому айди или как-то проще это делается? И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает.
>>449550 >И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает. Я тупой, все там работает. Но с первым вопросом по-прежнему непонятно.
http://jsfiddle.net/ajm805md/ Сделал вот так. С max-height хаком полная херня получается(пикрелейтед), он ведь не убирает блоки из общего потока, а это опять возвращает нас к использованию абсолютного позиционирования.
Посоветуйте форум php, где более-менее живое обсуждение (если такие существуют). Вот хочется иногда совета, а не у кого спросить. ОПа на всех не хватает, да и он занимается в основном с новичками по своему задачкнику. Мне бы вот хотелось проконсультироваться по проектированию БД.
Антуаны, подскажите по джойну таблицы к самой себе? У меня есть табличка с товарами, которые могут входить в комплекс товаров - ну там набор посуды, в него входит тарелка-кружка. Соответственно имеем: id | name | p_id 1 | Комплект посуды | 0 2 | Тарелка | 1 3 | Кружка | 1
Комплект тоже сам по себе товар, не нужно предлагать вынести связи в другую таблицу.
Мне нужно: 1) Получить все комплекты 2) Получить товары, не входящие в комплекты
Я вижу решение через подзапрос SELECT * FROM prod WHERE prod.id IN (SELECT DISTINCT p_id FROM prod) ну и NOT IN для второго.
Есть вариант через джойны добиться того же результата?
> С max-height хаком полная херня получается(пикрелейтед), он ведь не убирает блоки из общего потока Пусть не убирает. Если у блока нулевая высота то он ведь все равно ни на что не влияет?
У тебя на картинке просто padding/border/margin не убраны (неужели ты этого не видишь?). Надо либо обнулять их, либо засунуть блок внутрь обертки на которой мы ставим overflow hidden и max-height 0, тем самым полностью скрывая содержимое.
Мне кажется ты все пытаешься намекнуть что сделать анимацию невозможно? Хорошо, смотри пикрелейтед, я ради этого научился даже скринкасты записывать.
Там конечно много недостатков: анимирована сама вкладка, а не текст в ней, паддингов нет, но это мелочи которые решаемы.
Как организовать вставку в таблицы, если связь многие ко многим? Допустим, нужно создать базу книг, где одну книгу может написать коллектив авторов, и у одного автора много книг. Кажется, нужно сначала заинсертить в таблицу книг ее название и др.свойства, потом автора в его таблицу (если его там еще нет), а потом уже каким-то непонятным образом вынуть эти два айдишника и поставить их в результирующую таблицу.
Ей-богу, очень неудобно так учиться. Пошел на гугл, полчаса листал какие-то левые статьи. Или вообще не по теме, или непонятно, или не совсем то. ... Вот нашел на каком-то мертвом форуме запись от 2002 года, что используется какая-то системная переменная @@identity, которая выхватывает последнюю запись, над которой проводилась операция: SELECT @@identity as ID А, нет, это вообще по серверу MSSql. ... Вот есть метод PDO::lastInsertId, он возвращает айди последней записи. Так, поправьте если неправильно. Попробую родить:
>>449628 >Кажется, нужно сначала заинсертить в таблицу книг ее название и др.свойства, потом автора в его таблицу (если его там еще нет), И всё это делать внутри транзакции. А ты думал!
>а потом уже каким-то непонятным образом вынуть эти два айдишника и поставить их в результирующую таблицу. Ой нинадо нам тут про непонятные образы, а?... Функции для доступа к СУБД возвращают эти айдишники.
>>449629 > внутри транзакции Это как? Я использовал правильный подход, или есть другой? Просто очень угнетает отсутствие примеров. А потом когда потужишься и начинаешь выдумывать свои способы, упрекают в велосипедостроительстве, ага.
>Функции для доступа к СУБД Если про PDO::lastInsertId, то уже нашел.
>>449636 >>449629 Но я не понимаю, что такое транзакция! Переведите с иврита, пожалуйста:
Транза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются транзакционными системами, в процессе работы которых создаётся история транзакций.
Это один запрос? Или совокупность запросов за одно соединение с базой? >>449643 Спс. Только учти, что если не пойму что там написано, опять вернусь сюда флудить.
>>449644 Включение семафоров в алфавитном порядке, выполнение всех действий, отключение семафоров в обратном порядке. Читни Таненбаума, как свободное время будет.
Транзакция это группа запросов, которые выполняются как один.
Либо все выполняются, либо ни один (это называется атомарность). Атомарность должна соблюдаться даже при неожиданном отключении питания или принудительном завершении процесса MySQL (MySQL использует для этого двухэтапную схему записи на диск с ведением журнала изменений).
Согласованность значит что после завершения транзакции в базе не будет нарушений ограничений вроде ссылочной целостности. В MYSQL из ограничений есть только ограничения связанные с внешними ключами, а в других БД бывают более сложные ограничения.
Изолированность (вроде бы) значит что если пользователь 1 начал транзакцию и делает изменения, не закрыв ее, то эти изменения видит только он, а все остальные видят таблицы как они были до начала транзакции. А когда пользователь 1 закоммитит транзакцию, изменения увидят все.
То есть внутри транзакции пользователь как бы работает со своей отдельной копией базы которую видит только он.
Но формальное определение изолированности такое:
> The isolation property ensures that the concurrent execution of transactions results in a system state that would be obtained if transactions were executed serially, i.e., one after the other.
> Изоляция требует чтобы параллельное выполнение транзакций несколькими пользователями приводило к такому же состоянию, что и последовательное.
Не знаю, насколько это стыкуется с моим представлением.
И там еще есть надежность, которая говорит о том что база данных должна гарантировать сохранность результатов. MySQL например при коммите транзакции может ждать подтверждения от жесткого диска о том, что данные физически на нем сохранены и только после этого сообщает тебе что транзакция завершена.
Вопрос про транзакции и что такое ACID любят задавать на собеседованиях, имей в виду. Я бы разобрался в этой теме, так как заучивать это бесполезно, надо именно понимать концепцию и тогда все будет просто.
> Это один запрос? Или совокупность запросов за одно соединение с базой?
Это один или больше запросов которые соответствуют требованиям ACID.
Транзакцию ты начинаешь явно командой BEGIN, коммитишь командой COMMIT, откатываешь через ROLLBACK. Ты можешь поэкспериментировать с этим например в командной строке MySQL. Сделать изменение и убедиться что при ROLLBACK оно откатывается. Ну и открыть 2 клиента MySQL и убедиться что один не видит незакоммиченные изменения другого.
По умолчанию MySQL считает каждый запрос отдельной транзакцией, если ты не используешь BEGIN и не начнешь транзакцию аявно. Это называется AUTOCOMMIT. Его можно отключать.
> если не пойму что там написано, опять вернусь сюда флудить. Возвращайся конечно.
Ну и любые изменения в базе данных делаются через транзакции. Даже если ты их не используешь, база данных сама считает каждый запрос отдельной транзакцией.
То есть можно сказать что транзакция это операция внесения изменений в базу данных, состоящая из 1 или более запросов и соответствущая в той или иной мере требованиям ACID (эти требования на практике по моему на 100% не выполняются, степень соответствия требованиям, насколько мы близки к идеалу, называется уровень изоляции транзакций).
> Включение семафоров в алфавитном порядке, Это средство защиты от дедлоков в некоторых случаях.
Сами семафоры это средство синхронизации потоков и к транзакциям имеют отдаленное отношение. Ты наверно пытался изобразить реализацию транзакций на основе блокировок, но это очень непрактичный способ так как у тебя одна транзакция блокирует все остальные.
Анон спросил что такое транзакция, а не просил привести неэффективный пример ее реализации.
>>449680 1) Там не заданы аргументы в 41-й строке, 2) У меня обработчик ошибок состоит из одной строки: throw new Exception ("\n\n".'['.$errno.'] '.$errstr.' ('.strtr ($errfile, '\\', '/').', '.$errline.')'."\n\n");
>>449693 Оно и раньше «не работало», просто интерпретатор не печатал сообщение об ошибке. А теперь, если он что-то находит, он вызывает обработчик ошибок... почему аффтары Пыха так сделали, никто не знает.
>>449708 Да, я понял. Теперь он мне вместо нотисов прям в текст программмы выдает ошибку, но вот про эту строчку не понял throw new Exception ("\n\n".'['.$errno.'] '.$errstr.' ('.strtr ($errfile, '\\', '/').', '.$errline.')'."\n\n");
>>449712 Вначале «new Exception()» создаст объект со строкой, где будет «errno», «errstr» и тому подобное. Этот жуткий синтаксис — наследие Перла. А создание нового объекта — пародия на Жаббу, типа мы тоже крутые. Затем оператор «throw» напечатает цепочку вызовов и строку из объекта.
Параметры надо задать обязательно, раз в заголовке функции так сказано. И вызов «isset» всегда вернёт «true». До него выполнение вообще не доходило, т.к. функция и не вызывалась даже.
Прошу помочь. Есть, значит, код. Я хочу его зациклить, чтобы он работал, пока не выпадут 2 дабла. Но, я ламер. Как это можно осуществить? http://ideone.com/m5owm8
>>449742 >Но куда её вствить? если я эту строчку вствляю в обработчик, то тупо фатал еррор. Но ведь раньше всё работало... он же печатал цепочу вызовов, когда ошибка была.
>>449754 Нет, это мне ideone репортит об ошибке, он это делает автоматом же, без всех этих handler'ов, в то время как в коде программы у меня красным выдает error, а в http://ideone.com/aNbowR пишет зелененьким что все хорошо и типа нет ошибок.
>>449763 Здесь я ХЗ, я не использую «catch» в скриптах на Пыхе. Он у меня сразу останавливается и печатает цепочку вызовов, а дальше я нахожу строку в нортонкоммандере и руками исправляю её.
>>449765 Ну в общем не важно наверное пока, я прост сел учить ООП потихоньку, и типа как вообще с этими сущностями обращаться. Мне нужно гостевуху самописную для практики завернуть в ООП. В принципе уже появились идеи благодаря сегодняшнему посту >>449387 В общем спасибо
>>449559 Если пилить свистеперделки, то не нужен. В продакшене же пригодится, так как часто используется для хранения различных конфигов. Ну и некоторые апи его используют для респонсов.
Как правильно написать функцию чтобы можно было добавлять заранее неизвестное количество объектов? В мануалах к какой-нибудь функции это обычно пишут так: [, array $... ]
Почему мне не удалось умножить, с помощью анонимной функции, таким образом return $o->type 2; В мануале по array_map есть пример где анонимная функция возвращает return($n $n * $n); http://php.net/manual/ru/function.array-map.php
Поясните за ограничения (constraint) внешних ключей. Я так понял, что они нужны, чтобы по ошибке не заинсертить несуществующий в справочнике айди? Ну например если у нас 5 категорий товара с айди 1-5 и мы по ошибке указываем айди 7, которого нет. Индекс на внешних ключах автоматически не создается? Или это тоже зависит от движка mysql?
Аноны, почитайте, вот например интересное мнение что джуниоров (то есть вас) набирать выгоднее чем опытных программистов: http://siliconrus.com/2015/03/juniors/
Смотря для чего. Знание яваскрипта != знанию ноды.
На PHP есть много готовых CMS, где можно вообще обойтись без программирования. Если у тебя цель сделать как можно проще и быстрее то они тебе подойдут.
Вроде пока правильно, ты же пишешь аналог array_filter? Я бы исплоьзовал слово filter в названии так как это общепринятое название такой функции и проще догадаться что она делает.
Ну и еще, тебе надо будет проверить все возможные способы передать коллбек, а именно:
- имя функции или статического метода строкой - имя метода или статического метода массивом - анонимная функция (это ты сделал) - объект реализующий магический метод invoke
Надо проверить что все эти вещи передаются и вызываются.
> как передать родительский айди (то есть к какой страничке относится коммент) input type=hidden
> вставить какой-нибудь неотображаемый элемент, приравненый этому айди да
> И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает. Работает. Покажи неработающий код. И сразу второй вопрос, а в echo "id="; как подставить id ты знаешь?
Смотря что для тебя успех. Я бы не сказал что программисты особо успешные люди, если не брать Дурова, Билл Гейтса и других известных личностей. Ну и заниматься и изучать придется много.
Иногда используется. На нем могут быть построены API, магазины свои прайс-листы в нем передают часто, так что знать XML и методы работы с ним (и XPath конечно) может быть полезно.
> Такое ощущение, что сейчас это тред – учиться проходить собеседования, а не программировать. Знать ответы на вопросы собеседования, но не применить их на практике ни разу. > Я видел собеседования, где программисты не могли сказать, чем отличается объект от класса, процедурный подход от объектно-ориентированного. Вот, что важно.
Бессмысленно заучивать ответы на вопросы так как тебе скорее всего попадутся другие вопросы (если только это не совсем плохонькая компаняи которая даже свои вопросы придумать не может, а берет их из сети). Лучше понимать как что работает и для чего нужно.
Ну и вопросы странные.
> Что такое конструктор? По моему любой, изучавший ООП знает этот ответ. А не изучавший вряд ли пройдет собеседование.
А так, в принципе почитать книжку может быть и полезно чтобы обнаружить что ты чего-то не знаешь и исправить пробелы. В этом плане она может пригодиться.
> Что работает быстрее: преинкремент или постинкремент? > Преинкремент быстрее, т.к. постинкремент создает временную переменную, в то время как преинкремент изменяет саму переменную непосредственно.
такие утверждения должны подтвержаться ссылкой на исходники php. Или хотя бы измерениями. Если бы я собеседовал человека и он такое сказал, я бы попросил чемм это подтверждается. «прочитал в интернете» разумеется не ответ :) Если бы мне задали такой вопрос, я бы сказал что не знаю, и надо сделать измерения, но интуиция подсказввает что разница если и есть то очень маленькая.
> В двойных кавычках данные “парсятся” Это называется интерполяция строк и не надо придумывать свои названия
> Нужно определить длину строки функцией strlen(). Откуда она узнает сколько в строке символов? Плохой вопрос. Откуда новичок знает про устройство zval? максимум что он должен знать, что длина где-то хранится и ее получение это O(1).
> Как вывести все элементы массива на экран? echo implode
Ассоциативный массив это массив в котором ключи могут быть любыми числами или строками (или даже другими типами, если речь не о PHP), в отличие от «обычного» массива или вектора (термин из С++) где ключи являются числами от 0 до N и идут по возрастанию.
> Нарисуй форму для отправки файла: Есть функция move_uploaded_file, она специально для загрузки файлов сделана.
> Требуется создать для данной HTML-формы скрипт-обра- ботчик, который заносит построчно в файл result.txt полученные данные. > if (!$handle = fopen($files, ‘a’)) { Старье. Проще использовать file_put_contents
ну и такие примеры кода конечно выглядят ужасно:
> if($v % 5 == 0) echo $v.’</br>’; Никто не говорил что код будет запускаться через браузер. Ну и смесь php c html плохо смотрится.
> Есть массив a = array(тут много элементов). Проходим по массиву циклом for (i=0; i<=count(a); i++). Можно ли как-нибудь ускорить цикл? дебильный вопрос про микрооптимизаию без пруфов.
Алсо я бы добавил ответ 3) использовать HipHop (или Си++) например
> Какая функция возвращает количество рядов результата MySQL запроса? > mysql_num_rows(). Устарела
> Какие паттерны знаешь? Этот вопрос глупо задавать так как в 90% случаев человек без опыта про эти паттерны только в книжках читал и на практике не сталкивался (хотя если изучать фреймворки вроде Symfony 2 то можно столкнуться).
Так как после этого его попросят проиллюстрировать это кодом.
> Полиморфизм. Это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач. Одно и то же имя?
> Что такое виртуальный метод? Это вопрос по Си++, а не про PHP. В PHP методы не делятся на виртуальные и нет. Разумеется человек не изучавший Си++ и рассуждающий про виртуальные методы скорее всего наговорит чуши.
> Область видимости переменной – это место в программе, в котором доступно значение переменной. Каждая переменная имеет свою область видимости (есть локальные переменные и глобальные переменные) > Public. Метод/переменная доступны из любого места в коде. Тут путают понятия scope (область видимости переменной) и access (модификатор доступа у полей класса)
> Локальные доступны только конкретной подпрограмме, глобальные – всей программе. Ограничение зоны видимости придумали как для возможности использовать одинаковые имена переменных (что разумно, когда в разных подпрограммах переменные выполняют похожую функцию), так и для защиты от ошибок, связанных с неправомерным использованием переменных. То же самое, бред
> Интерфе́йс — семантическая[источник не указан 478 дней] и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом.
> Интерфейсы объектов позволяют создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала
> Кроме того, что абстрактный класс наследуется (etxends), а интерфейс реализуется (implements). Не хочу огорчать, но интерфейсы тоже наследуются. Например мы можем сделать интерфейс Likeable для сущностей которым можно ставить лайки (пост, комментарий), а также interface Dislikeable extends Likeable для сущностей которые можно вдобавок минусовать.
> Зачем нужен интерфейс, если есть абстрактный класс? затем что это разные вещи и абстрактным классом нельзя описать требования к (или умения) объекту.
А тот ответ который приведен показывает что автор сам не знает зачем нужны интерфейсы и думает что это как абстрактный класс. от которого можно наследоваться несколько раз.
> Приведи пример наследования в JavaScript. Куча неправильного кода.
> Первичный ключ (primary key) – столбец, значения которого во всех строках различны Неправильно. Первычный ключ это поле, идентифицирующее строку (вроде номера паспорта). То что оно уникально это следствие.
> MyISAM > – в большинстве случаев он быстрее, так как нет расходов на транзакции; источник?
> Чем отличается WHERE от HAVING? тем что первое применяется до группировки а второе после
> . Что делает свойство clear? > Устанавливает, с какой стороны элемента запрещено его обтекание другими элементами. Если задано обтекани Не очень правильно. Как можно запретить «обтекание»? clear добавляет элементу отступ (margin) сверху так, чтобы элемент оказался ниже чем флоаты.
> Есть ячейка таблицы, в ней 3 дива, в каждом диве по слову. На первый див применен стиль float: left; на третий: float: right; что нужно применить на вто- рой див, чтобы все три надписи/дивы были в одной горизонтальной строке, т.е. первый имел бы выравнивание по левому краю, третий по правому, а вто- рой по центру?
text-align: center;
> В чем вообще смысл jQuery? Зачем оно надо? > Суть jQuery в том, чтобы отбирать элементы HTML-страниц и выполнять над ними определенные действия. Какой вопрос, такой ответ...
В общем, почитать эту книжку можно, но заучивать то, что там написано, не стоит.
ideone не пишет ошибки если ты исплоьзуешь кнопку Ideone it. Надо страницу обновить чтобы их увидеть.
> почему аффтары Пыха так сделали, никто не знает. Исторически там не было исключений (и ООП в принципе), наверно по этому. bash тоже по умолчанию при любой ошибке как ни в чем не бывало продолжает выполнять скрипт. К счастью, set -e его лечит от этой дурной привычки. надеюсь в будущем и мы перейдем на исключения only.
Я тебе могу посоветовать главу по ООП в моем учебнике (ссылка в ОП посте). Там все понятно объясняется и есть хорошие задачи, которые я могу проверить. Ну и там не придется писать эти странные конструкции, которые ты пишешь потому что я вижу что ты совсем ничего не понимаешь.
> Мне нужно гостевуху самописную для практики завернуть в ООП. У нас есть хорошее задание сделать список студентов с подробными комментариями и разъяснениями. И опять же, я готов его проверить и например сказать где ошибки: https://github.com/codedokode/pasta/blob/master/student-list.md
> class SplObjectFunctions { Ты бы мог унаследовать SplObjectStorage и таким образом сделать «улучшенную версию» этого класса.
> array('Foo', 'searchZeroType') Это неправильно. так можно делать если метод статичесикй, но у тебя это не так и надо передавать вместо Foo конкретный объект. Перечитай мануал, там наверно где-то это написано: http://php.net/manual/ru/language.types.callable.php
> return $o->type = $o->type 2; //Почему не получилось c return $o->type 2; Это неверно. Функция не должна менять объект, она должна только возвращать новое значение.
И по моему я тебе уже это говорил. Я уверен, что говорил:
не объединяй присваивание значения и return. Это 2 разных действия и их надо писать в 2 отдельных строки
> public static function object_map Это неверно. array_map всегда возвращает новый массив не изменяя старый. А ты возвращаешь тот же самый объект.
> они нужны, чтобы по ошибке не заинсертить несуществующий в справочнике айди? да
> Индекс на внешних ключах автоматически не создается? Создается (в MySQL) так как без него проверка будет медленно работать. Индекс останется даже если удалить FOREIGN KEY.
> MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist.
>>449868 Мне это понравилось. >Просто прохождение собеседования часто зависит не от навыков программирования, а от социальных навыков. Тебя могут завернуть, если ты, там, вяло руку рекрутеру пожал, или смело в глаза не смотрел. Или задаются пространные вопросы типа чем отличается php 5.3 от php 5.2.
Все так, меня один раз спросили зачем нужен HTML, я был немного ошарашен, и ответил какими-то общими словами. После этого я начал готовиться к собеседованиям тщательней, потому что, как оказалось, код, который я писал за время обучения, собеседователей не очень интересует.
Название переменной - существительное, типа надпись на коробке в которой что-то лежит. Название функции - глагол, действие над чем-либо. Название класса - существительное, обобщенное определение для порождаемых объектов. А интерфейс как называть? Также как класс? Как-то непрозрачно получается. Ведь это не Человек, Собака, Пользователь, а набор функций.
>>449890 Ну почему же, вот у тебя год растет с каждой итерацией цикла, ты можешь сделать так, что бы и курс доллара рос например вместе с ней, или рандомить изменение курса внутри цикла скажем.
Сап, пхп не знаю вообще и пишу фо фан. Пишу код, который работает с апи твитч.тв.
Что мне нужно? Нужно, чтобы пользователь писал свой ник в поле и дальше скрипт (либо дописывал вокруг этого ника шаблон из кода , либо добавлял его в массив $channels = array, а потом дописывал код шаблона для каждого ника измассива) Собственно я почти все написал, но нужно только вот эту подстановку сделать.
>>449932 Конкретно как слепить fwrite($_file, "$channels = array(".$_inkey.") ;"); и код отображения стрима, конкретно нужно всунуть это говно в массив.
Или же сделать fwrite($_file, "вписать сюда весь шаблон отображения") чтобы после вписки ника, появлялся еще один кусок шалона, только уже с введеным ником.
Еще вопрос про верстку макета. Там много картинок в псд, есть какой-то способ их вытащить оттуда, кроме как каждый слой отдельно вытаскивать в новый холст и сохранять отдельным файлом? Еще там дофига шрифтов, которых у меня нету на харде(как же они отображаются в фотошопе?), что-то я их не заметил в папке с шаблоном.
>>449926 На packagist.org есть строки, которые нужно прописывать в require для подключения зависимостей. "yiisoft/yii": "1.1.16" - для первого yii, например.
ОП (куда пропал ОП-трип? "ОП ненастоящий"? ОП умер, но у треда PHP должен быть добрый ОП и знамя подняли?), у меня git внезапно начал считать конкретный .php файл бинарным. Кодировка при этом корректная, переводы строки тоже, PHPStorm видит дельты корректно, но в реп и в log показывает "this binary file...". Как заставить гит снова считать файл текстовым?
Вечер в хату. Как я понимаю, namespace и use являются неотъемлемой частью ООП парадигмы в PHP. Как относиться к людям, которые вообще их не используют в 2015 году? Сам я совсем нюфаг в PHP, потому и интересуюсь.
>>449880 Что бы обмениваться данными в интернетах инбифо: ты путаешь с http, сучечка, вот зачем. Это язык разметки и на нем пишется каркас сайтов и страничек. Плюс он стандартизирован и его понимают все браузеры. Я ответил на вопрос? не гугля
>>449938 Ну ты сделал что у тебя курс тупо рандомится каждый раз, а это не очень. Ты сделай что бы у тебя рандомилось некое изменение этого курса. Пусть может быть какы отрицательным, так и положительным. Пусть так же будет не целым числом рублей, а скажем с долями до 0.1, ну например за год курс изменился на 0.1 рубля, или на -1.5 рубля, ок? Пусть будет например маленький шанс словить обвал рубля который сразу поднимает курс доллара в два раза! Пусть у тебя еще выводится к твоим данным дополнительно курс доллара, а так же его изменения.
Что бы изменения были типа: 1-й год: изменение курса: 0 курс доллара 60 рублей 2-й год: изменение курса: 0.1 курс доллана 60.1 рублей 3-й год: изменение курса: -1.5 курс доллара 58.6 рублей, и так далее и посмотрим куда доллар ускачет в итоге за 100 лет. 4-й год: изменение курса: дефолт НЕ БУ ДЕТ... говорили они, скупая доллар по 117.2 рублей 5-й год .... последний год.
>>450043 Кек, ночью займусь. Думал о том как сделать рандомным курс, но у меня не срослось допустим к какому либо значению mt_rand присвоить свой курс. Допстим прописать рандомизацию от 1го до 6ти и каждой присвоить курс. Япытался, но короче вскипел и сделал так.
>>450051 >но у меня не срослось допустим к какому либо значению mt_rand присвоить свой курс. Я не понял ничего из этого, но скажу тебе вот что: mt_rand - это функция, которая тебе всего лишь возвращает значение, в зависимости от параметров которые ты ей передал. ну тип если ты ей передал 1 и 5, то вернет тебе случайное число от 1 до 5, что бы это число зафиксировать, тебе нужно сохранить это в переменную: $var = mt_rand(1,5); Ну это ты я думаю и сам понял.
Ты просто рандомь колебания курса для начала. И эти колебания накладывай на текущий курс? Это понятно как сделать для начала? Понимаешь так же как сделать так, что бы у тебя рандомились не целые числа, а скажем с 1 знаком после запятой?
>>449874 >> Почему мне не удалось умножить, с помощью анонимной функции, таким образом return $o->type 2; покажи код телепаты в отпуске Я нечаянно не тот код скинул. Вот этот должен быть в том посте >>449800
> return $o->type = $o->type 2; //Почему не получилось c return $o->type 2; >Это неверно. Функция не должна менять объект, она должна только возвращать новое значение. Тогда, это нужно сделать вот так:
$r = $o->type; $r = $r x 2;
return $r
Верно? Но как это применить к определенному параметру? Передавать изначально в функцию? А дальше как? Не могу сообразить. Подскажи плиз.
>И по моему я тебе уже это говорил. Я уверен, что говорил: >не объединяй присваивание значения и return. Это 2 разных действия и их надо писать в 2 отдельных строки Эм... Я не припоминаю такого. Помню что ты говорил что можно передавать сразу функцией ( Это было здесь >>444020 >Тут можно сразу написать return count ... без лишних переменных. ), а вот что бы я передавал выражение когда-либо, за исключением этого случая - я не припоминаю. Плюс, так еще было написано в мануале по array_map.
>Это неверно. array_map всегда возвращает новый массив не изменяя старый. А ты возвращаешь тот же самый объект. Действительно. Я не думал что это может быть так. Тогда, мне нужно будет сделать эту в функцию с двумя циклами: Первый будет создавать новый SplObjectStorage, с помощью $s->attach(clone $object); Второй будет изменять изменять значения.
>>450005 Зачем вынимать, все зависимости у тебя будут в вендоре. Подключаешь их в index.php используя созданный композером автолоадер. Так же отдельно подключаешь Yii.
> как же они отображаются в фотошопе? Фотошоп вместе с текстом сохраняет его скриншот картинкой.Но отредактировать такой текст не получится.
> есть какой-то способ их вытащить оттуда, кроме как каждый слой отдельно вытаскивать в новый холст и сохранять отдельным файлом? Ты должен научиться «нарезать» макет. Есть разные способы. Знание горячих клавиш поможет сильно ускорить работу.
Во-первых ты должен освоить все кнопки и инструменты в диалоге File -> Save for Web (Ctrl + Alt + Shift + S). Им ты можешь подобрать оптимальный формат и настройки картинки при сохранении. Разумеется прежде чем им пользоваться ты должен выучить особенности и преимущества разных форматов графики: JPG, GIF, PNG8, PNG24, SVG.
Я не помню точно, но по моему слайсы сохраняются вместе с фоном, что не всегда желательно, иногда нам нужна картинка на прозрачном фоне. В этом случае придется вырезать вручную.
Вырезаешь так: выделаешь прямоугольник и далее жмешь либо Ctrl + C (скопировать из текущего слоя) либо Ctrl + Shift + C (скопировать из всех слоев вместе), затем Ctrl + N (новый документ, размеры уже будут подставлены), затем Ctrl + V (вставить), затем Ctrl + SHift + Alt + S. Я обычно сохраняю и PSD с вырезанным куском, и картинку для веба. В этом случае, если я обнаружу например неровные края или артефакты сжатия, я могу вернуться к исходнику.
Если тебе надо вырезать картинку из несклоьких слоев, но без фона, надо сначала отключить слой с фоном, а потом вырезать.
Если набить руку, то нарезка простого макета не займет много времени.
Ну и если ты делаешь задание из «Путь HTML» то тебе некоторые картинки надо будет объядинить в спрайты, вручную. Удобно для этого создать новый документ и с помощью направляющих создать сетку, по которой ты будешь выравнивать картинки.
Ну и такие инструменты как пипетка и линейка тебе пригодятся, я думаю, ты их уже нашел. Они выводят информацию на панель которая открывается кнопкой F8 по моему.
А, еще по слоям можно перемещаться по моему Ctrl + PgDn/Up (или Alt+ PgDn?).
Еще, залить выделенную область фоном или передним цветом можно с помощью Ctrl + Alt + Backspace/Ctrl + Shift + Backspace. залить другим цветом или текстурой можно с помощью Alt + F5 (или Alt + Ctrl + F5?).
Инструменты переключаются буквами, B — кисть, M — выделение, V — перемещение, U — прямоугольники.
В общем, советую изучить инструменты и горячие клавиши — поможет сэкономить время.
Ну и перед нарезкой я советую рисовать на бумаге схему, как будут расположены блоки, выписать шрифты, размеры и цвета — потом при верстке смотреть их на бумаге удобнее чем лезть в фотошоп и мерять.
А, еще по моему, если картинка в отдельном слое с прозрачностью, можно выделить ее нажав в окне слоев на слой с клавишей Ctrl. Или двойным кликом? Не помню.
Я могу рассказать еще про один трюк, который я сам применял. Допустим у нас есть большая фотография с небольшой надписью (или любым другим контрастным мелкодетальным изображением) на ней. С одной стороны, картинка хорошо жмется JPG, но при этом текст мылится. А PNG идеально передает все, но картинка весит много. В этом случае уместно может быть разрезать картинку на 2 части: фон который мы жмем JPG и надпись сжатая в PNG.
Ты конечно тут мог бы сказать что ты вообще-то php изучаешь, но я бы советовал не ограничивать свой кругозор. Мне например умение пользоваться фотошопом пригодилось. Тем более я же не говорю что от тебя требуется тратить по 2 часа на каждую картинку, просто почитай чтобы знать что вообще можно сделать.
А что ты знаешь? Вообще глубокое изучение Symfony 2 очень полезно для бекендщика (разумеется перед этим ты должен изучить ООП, MVC и DI). Также, база данных: индексы, оптимизация.
Посмотреть название ты можешь. Выбирай Text Tool (T) щелкай на надпись и появится шрифт и размер.
Шрифты по моему скачиваются в интернете. но на компьютер тебе ставить их не обязательно. Тебе главное их подключить к странице либо через Google Fonts либо через этот конструктор http://www.fontsquirrel.com/tools/webfont-generator
(здесь ты можешь заметить что даже подключение шрифта все браузеры умудрились сделать по-своему и с подводными камнями. Аналогичные проблемы есть с форматами видео и аудио поддерживаемыми браузерами. Привыкай.)
> зачем нужен HTML, А вопрос-то неплохой, проверяет понимаешь ли ты как устроен веб или нет. Не знаю, для чего он нужен, но HTML создан для верстки веб-страниц, которые затем отображаются в браузере. Самый первый браузер (mosaic) использовал HTML.
УмеющийХодить (Walkable), УмеющийПрыгать (Jumpable?). Также если интерфейс представляет не умение, а объект, управляющий машиной то ИнтерфейсВодителя (DriverInterface) например (а реализациями этого интерфейса могут быть например ЧеловекВодитель, КотВодитель и РобоВодитель).
Я также добавлю что вендорные префиксы начали использовать несколько лет назад по той причине что браузеры внедряли поддержку новых фич до оформления стандарта, и префиксы предназначались для любителей поэкспериментировать (а не для верстки). Но вместо этого верстальщики начали массово их использовать в верстке, причем часто они ставили префикс для одного браузера и не ставили для другого (прямо как ты). Эта практика была признана дурной и теперь экспериментальные фичи надо включать в настройках браузера, по умолчанию они не доступны. Но вендорные префиксы стоит по-прежнему ставить для более старых браузеров.
> input.tab > label.tab{ Это плохая идея, использовать один класс для разных целей, так как создает путаницу. Лучше совместить название виджета и название элемента например:
.tabs-input { .table-header {
Ну и для каждого инпута незачем свой класс придумывать. Можно же сделать такое правило:
Это хороший вопрос. Важно правильно называть все сущности в программе. А те кто не хотят изучать эти правила и следовать им — редиски, и их код лучше даже не смотреть, 100% что это какая-нибудь нечитаемая лапша которую никто не поймет.
>>450103 >Ну и перед нарезкой я советую рисовать на бумаге схему, как будут расположены блоки, выписать шрифты, размеры и цвета — потом при верстке смотреть их на бумаге удобнее чем лезть в фотошоп и мерять. Охуительные истории мимо-верстун
Сейчас сайт сделан так что трипкод постоянно теряется. Я замучался его вводить.
> у меня git внезапно начал считать конкретный .php файл бинарным.
Какая кодировка? Не utf-16 случайно?
Также пишут git может реагировать на слишком длинные строки.
Принудительно сделать файл текстовым можно через http://git-scm.com/docs/gitattributes но я бы советовал вместо этого разобраться и исправить проблему с файлом.
fopen/fwrite заменяется на file_put_content. ты наверно по какому-то древнему учебнику учился.
Ну и плохая идея начинать переменные с подчеркивания. Некрасиво же и непонятно чем _file лучше чем file? Тем что дольше печатать или тем что хуже читается?
Анон говорит что если не генерировать каждый год курс случайно, а генерировать случайное изменение (причем с большой вероятностью изменение небольшое, но иногда случаются обвалы) то будет смотреться более реалистично.
Кстати, я не купил ни одного доллара когда курс упал первый раз на 10% (и позже тоже). Я молодец? В 2008 году кстати тоже не покупал.
> Эм... Я не припоминаю такого. Помню что ты говорил что можно передавать сразу функцией Значит не тебе говорил
> а вот что бы я передавал выражение когда-либо, за исключением этого случая - я не припоминаю. Выражение писать в return можно. Но присваивание это не совсем выражение, это фактически отдельное действие и нехорошо его совмещать с return. Если мы вообще всю программу в одну строчку запишем, работать она будет но читать ее будет трудно.
Посмотри на эти 3 примера. Какой смысл писать 1-й или 2-й вариант когда есть третий?
> Тогда, мне нужно будет сделать эту в функцию с двумя циклами: > Первый будет создавать новый SplObjectStorage, с помощью $s->attach(clone $object); > Второй будет изменять изменять значения. Не вижу смысла делать 2 цикла. Сделай один.
Учти еще один момент. Объекты передаются (как будто) по ссылке. Это значит что если ты меняешь объект в функции то он меняется в исходном массиве в любом случае, так как объекты не копируются, передается ссылка на тот же самый объект.
Потому применять array_map к массиву объектов чтобы получить на выходе новый массив объектов довольно глупо. Какой смысл создавать новый массив с теми же самыми объектами? Ты можешь пройтись по исходному массиву и поменять объекты в нем:
foreach ($objects as $obejct) { $object->x= 2; }
Эффект будет тот же самый только без создания второго массива.
Array_map используют для других целей, например извлечь результаты вызова метода в массив:
> Первый будет создавать новый SplObjectStorage, с помощью $s->attach(clone $object); Погоди, зачем клонировать объекты? В ООП в 99% случаев мы хотим получить тот же самый объект.
Я думаю, map должен работать по другому. Он должен возвращать массив значений, которые вернет функция. То есть map обходит SplObjectStorage, для каждого объекта вызывает функцию и возвращает массив значений. Например ее можно использовать так, чтобы собрать результаты вызова метода:
А что плохого то? По твоему постоянно переключаться и переделывать все быстрее будет? Плюс, можно сразу подписать где мы хотим флоаты сделать например, где инлайн блоки, прикинуть как макет будет тянуться, какой блок какой расталкивает и в каких местах.
>>450152 >А что плохого то? Лишние действия. >По твоему постоянно переключаться и переделывать все быстрее будет? Что переделывать-то? Нужны данные из макета, полез и посмотрел. >Плюс, можно сразу подписать где мы хотим флоаты сделать например, где инлайн блоки, прикинуть как макет будет тянуться, какой блок какой расталкивает и в каких местах. Я это делаю в голове. Брат жив, зависимость есть.
> Нужны данные из макета, полез и посмотрел. Ну так мерять расстояние и размеры удобнее сразу, а не по одному, по моему. Особенно когда элементы бок к боку стоят. Чем постоянно переключаться.
>>450152 > Я вижу что ты явно пропустил уроки Я уже все написал. Там было все проще. Просто я тупил и не умел работать с json массивом. На пхп начал писать вчера обедом, уроки я вообще не посещал.
>>450161 Сразу конечно удобнее, но только если ты способен все это держать в голове. Записывать на бумажечку как минимум странно, как максимум долго, если твой макет хоть чуть выше базового.
ты же сохранил уже результат функции mt_rand() в переменную $course перед этим. Используй её в проверке. А лучше заведи другую переменную под это, а то у тебя в переменной $cource совсем не курс лежит, после строчки $cource = mt_rand(1,6);
>>450191 Кого заменить? Я пишу просто фо фан. Это никакого отношения к гудгеймпу не имеет. Языка я не знаю, но вот решил просто попробовать сделать аналог http://prestige-gaming.ru/streams/ например.
Суть в том, что когда ты вводишь ник - к тебе приходит json массив от апи гг. И этот массив начинается с id:{}. То есть получается начало массива и его ид не известен т.к я встраиваю других юзверей и их ид без отдельного json запроса мине не известны, только ник.
Ну и я думал, что без этого не работает. Однако там похуй на это первое значение id и можно сразу подставлять ник и делать foreach сразу с ником к массиву. На первое ид там похуй.
Теперь я хочу сделать сортировку стримов ГГ по количеству зрителей. У АПИ твича это говно как-то само работает, а вот на ГГ нет.
Вообще я бы хотел этот код как-то встроить в Вордпресс, например, или в код вордпресс и сделать уже серьезное говно. Но вот вп знаю только на уровне тем и банально удалить что-то, чтобы не показывало автора, кек.
Если хочешь, то я могу нанять тебя за 30 рублей/неделя.
Аноны, есть какие-нибудь задания по XML? Я что то найти него не могу, я та понял он много где применяется, вчера начал читать про xml, при помощи DOM написал некоторое подобие рсс ленты, что на нём ещё можно делать? Или большая часть задач по XML это получение данных из базы данных и поставление их между нужными тегами?
>>450313 Чет я перечитал тебя дважды, и все равно ничего не понял. Массив там такого вида: массив с 1 элементом, название которого это айдишник игрока, а значение - это другой массив с его данными или хуй пойми чем.
>>450112 > но на компьютер тебе ставить их не обязательно. Тебе главное их подключить к странице либо через Google Fonts либо через этот конструктор Как же я их подключу через конструктор, если кнопка upload fonts загружает шрифт с жесткого диска. Другой я там не нашел. Ну а в гугл фонтс нужный мне шрифт недоступен.
> Языка я не знаю, но вот решил просто попробовать сделать Это тред изучения php. Для тех, кто хочет учиться писать правильно. Что ты тут тогда забыл?
Непонятно зачем ты тут настойчиво выкладываешь примеры того как делать не надо. Что ты хочешь сказать этим? Это такой изысканный вариант запостить сажу?
Надо загрузить ее HTML-код в DOM ( http://php.net/manual/en/domdocument.loadhtml.php ), распарсить ее, например, с помощью Xpath, и получить массив объектов JobOffer с полями: title (название вакансии), minSalary, maxSalary (0, если не указана), company (название компании), address, publishDate (дата публикации в вие объекта DateTime).
То есть HTML волшебным образом превращается в массив объектов, с которыми можно нормально работать, например, вывести список с помощью echo
Не нравится парсить вакансии? Парсь торренты: www.nyaa.eu/?page=search&cats=0_0&filter=0&term=watamote О, уже 4 серия вышла, надо создать массив объектов TorrentFile с полями category (одна из констант), title, torrentUrl (ссылка скачивания торрент-файла), size (числом), seeders, leechers, downloadCount
Задача 2 на XML Условия в ней примерно такие: пользователь вводит адрес в одной из столиц (Москва или Спб — выбери сам), скрипт определяет район города и ближайшее метро.
Первым запросом ты определяешь координаты по адресу (и существует ли адрес). Вторым обратным запросом, определяешь район и метро по координатам. Для запросов используется формат XML, так что использовать DOM придется. Для отправки запросов достаточно file_get_contents или curl. На бесплатном хостинге запросы отправлять нельзя, так что скрипт должен работать их командной строки на локалхосте.
Есть еще такая, на работу с большими файлами:
> 3) работа с ФИАС (сначала придется скачать 1.5 Гб архив с базой), надо скриптом разобрать базу и составить список районов и городов нашей страны. Огромную базу таких размеров в память не засунешь, надо исхитряться, например, с помощью XMLReader. Ну или если тебе не нравится ФИАС, можно сделать что-то аналогичное с OpenStreetMAp, например, распарсить оттуда координаты остановок автобусов.
XHTML давно умер (потому что никто его не использовал, все писали псевдо XHTML который браузер парсил как HTML. Зачем так делали, до сих пор не понимаю).
Там дальше будет задача про ООО Вектор. А эта задача проверяет самые базовые вещи: способен ли ты понимать то что написано и способен ли составить куски в нужном порядке. Ну и должна повышать уверенность в своих силах перед более сложной задачей.
>>450478 >>450481 Ну да, просто после ада по типу регулярок или доп задач это кажется супер легким. Или это можно было начинать после изучения функций? Спин-офф в ооп делать сразу и параллельно иди в более сложные задачи по учебнику.
>>450469 >>450464 спасибо, ребят, всё заработало. Кстати, почему не работает \n и вместо него ставится пробел? Пока заменяю тегом </br>, но это же не есть правильно?
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Вообще хорошо что задача кажется тебе легкой. Многие боятся ООП и говорят что он нереально сложный и спрашивают реально ли стать программистом без ООП и фреймворков.
>>450495 Warning: Cannot modify header information - headers already sent by (output started at Z:\home\word\www\index.php:7) in Z:\home\word\www\index.php on line 8 Вот что пишет.
>>450495 В учебнике опа все доступно объяснено, помню пытался понять по какой-то книге по С++, что такое конструктор, но так и не осилил. А у опа все просто и понятно: конструктор - метод, который автоматически вызывается при создании объекта класса.
>>450147 >Прописать в функции все что надо Получается мы для каждого класса будем писать отдельный метод? Мы же заранее не можем знать какие свойства будут.
>Какой смысл создавать новый массив с теми же самыми объектами? Ты можешь пройтись по исходному массиву и поменять объекты в нем:
>>449874 >Это неверно. array_map всегда возвращает новый массив не изменяя старый. А ты возвращаешь тот же самый объект. Я запутался =_=
>>450148 >Я думаю, map должен работать по другому. Он должен возвращать массив значений, которые вернет функция. То есть map обходит SplObjectStorage, для каждого объекта вызывает функцию и возвращает массив значений.
Не понял, а зачем нам получать массив? Я думал, object_filter будет нужен для того что бы поменять определенные параметры в объекте или получить новые объекты с изменением определенных параметров.
>>450656 Ну в JS массив - это просто набор значений с порядковыми номерами, а объект - набор ключ-значение. А в PHP можно создавать массивы, у которых вместо номеров стоит текстовый ключ.
>>450686 За пару месяцев ОП научил меня делать простую регистрацию. Потом спонтанно решил поскроллить вакансии по php у себя в провинции. Нашел, позвонил, пригласили, написал короткое резюме в пол страницы, ответил на пару вопросов на собеседовании, приняли. Закончилось все тем, что у моего работодателя были какие-то проблемы с налогами и ему заблокировали счет. Он мне до сих пор должен лол.
>>450701 Просто там был Битрикс. Мне он очень сильно не понравился, и я решил что лучше будет изучить какой-нибудь фреймворк типо Slim или Yii, чем возвращаться на что-то подобное. Да и просто желания нету работать, если честно ◕ ‿ ◕
Битрикс не уникален, практически все CMS (Drupal, Wordpress) написаны гм.. людьми не особо знакомыми с ООП, паттернами, промышленной разработкой, в общем по ощущениям их пишут какие-то студенты-самоучки в плохом смысле этого слова. Даже если там применяется ООП, то часто неправильно. Ну и упор в CMS делается на редактирование через админку, а не программирование.
По моему опыту, пока твой шаблон по структуре соответствует стандартному, все будет хорошо, но как только ты захочешь сделать что-то нестандартное, тебя ждет боль. Я не знаю насчет битрикса, но платные CMS иногда содержат закрытый (обфусцированный) код, я с такой CMS когда-то работал и в итоге было проще некоторые вещи делать яваскриптом, изменяя текст страницы после загрузки, чем разобраться как это сделать средствами CMS. А в той CMS с которой я работал гении придумали свой язык шаблонов (без циклов и ветвлений разумееся и без htmlspecialchars), сами шаблоны хранились в базе и редактировать их можно было только через админку (что исключало возможность положить их в CVS или деплоить на свервер скриптом, все руками).
Не факт конечно что он над самой CMS будет работать, ну и может у них требования не высокие, но все же, у них некоторое редакции битрикса дороже стоят чем зарплата этого разработика.
Вообще, по хорошему тебе бы стоило сделать отдельный тред про разработку своего проекта, но так как модераторы не разрешат это сделать (почему? непонятно), можешь вести дневничок тут.
> Теперь я хочу сделать сортировку стримов ГГ по количеству зрителей Отсортируй сам на стороне php, там есть sort, usort и еще куча похожих функций.
DOM не загружает файлы из интернета. Ты должен загрузить его сам.
Тебе нужен HTTP клиент.
Удобнее всего использовать для этого библиотеку вроде Guzzle ( https://github.com/guzzle/guzzle ). Преимущество что она сама и загружает все, и ошибки обрабатывает.
Еще можно загрузить файл через curl (минус — придется возиться с настройкой, обработкой ошибок самому) или даже через file_get_contents('http://example.com/1.txt') но в этом случае если например тебе захочется отладить код или ошибки, это будет малореально сделать.
Потому я бы делал через Guzzle.
Хорошо бы кешировать файл на диске чтобы не обращаться к серверу много раз. У Guzzle есть готовый плагин для этого (потому надо использовать популярные библиотеки а не писать велосипеды на курле): https://github.com/guzzle/cache-subscriber
Причем я подозреваю там можно его как-то настроить чтобы он не слал запрос 304, а просто принудительно все кешировал.
> $this->fullName = $this->name . " " . $this->getShortName(); Если fullName всегда вычисляется из name то незачем заводить такое свойство и хранить его. Ты всегда можешь вызвать метод.
А в твоем случае надо как-то отслеживать, если имя поменялось, и менять fullName. Проще не хранить его вообще.
> public function getNormalHoursWorked() > public function getOverHoursWorked() Одну из этих функций можно упростить, посчитав например normalHours как общее число часов - переработка.
> $spases = array_fill(0, ($length - $strLength - 1), " "); Есть str_repeat (она поддерживает кириллицу и любые символы).
Так, вообще неплохо. Исправь замечания и переходи к более сложной задаче.
array_map работает так: она создает новый массив, значения в котором пропущены через функцию:
new = fn(old);
Старый массив остается неизменным.
Например в твоем случае если у нас есть коллекция объектов, мы бы могли получить массив значений какого-то поля этих объектов. Есть коллекция пользователей, мы хотим получить массив их имен. Если есть массив чисел, мы можем получить массив их квадратов.
Почему она должна возвращать массив а не SplStporage? Потому что в SplStorage нельзя хранить строки.
array_filter создает новый массив, содержащий только значения одобренные callback функцией. В нашем случае filter позволяет отобрать часть объектов. Можно сделать чтобы она возвращала SplStotrage, можно чтобы массив.
> Я запутался =_= Функция array_map не должна менять исходный массив, а создавать новый. Твой код делал непонятно что.
> Я думал, object_filter будет нужен для того что бы поменять определенные параметры в объекте или получить новые объекты с изменением определенных параметров. filter отбирает часть коллекции по условию. Сами значения коллекции он не меняет. Ты читал мануал по array_filter/array_map?
Чтобы поменять значения в объектах нам нужен либо обычный цикл, либо аналог array_walk.
> получить новые объекты с изменением определенных параметров Если ты изменишь поле объекта то новый объект от этого не появится. Новый объект создается только через new или clone. И в ООП в 99% случаев тебе это не нужно, создавать новые объекты из существующих.
Почему? Потому что объекты напоминают сущности реального мира, и в реальном мире сущности не клонируются. Например, товары на складе не копируются сами по себе и работники в компании тоже не удваиваются.
Реальные случаи где нужны map/filter это получение массива значений и отбор части объектов по условию.
никак не могу разобраться- не устаналивается mbstring . сам файл есть , пусть стандартный , в файле extension=php_mbstring.dll раскомменчен , но в php.info модуль не появляется. Как это лечить?
>>450907 Я так понял ты на айдеоне код запускаешь. Он пишет ошибки внизу, я выделил красным. Видишь, написано in line 8? Значит на 8ой строке ошибка, точнее перед 8ой строкой нет точки с запятой.
>>449862 php файл лежит в www , там папка test , в vhosts.conf я дописал Listen 8122 , ну и прописал путь на эту папку test. Пишу в браузере путь на папку , там выбираю нужный. Там еще куча мелких файлов , чисто php , они грузятся нормально, а этот нет.
Вот я не до конца понимаю когда в html файле php код как его правильно запускать.
>>450807 >А в твоем случае надо как-то отслеживать, если имя поменялось, и менять fullName. Проще не хранить его вообще. Хорошо, согласен, а я сначала порадовался себе, что круто придумал: сразу в конструкторе вычислять это, так как на выход идет имя и уже есть с чем работать. >Есть str_repeat (она поддерживает кириллицу и любые символы). Когда писал эти функции я бегло пробежался по главе учебника со стороками, но не нашел там ничего, поэтому сделал как в голову пршло, не думаю что мой метод был плох, просто лишняя строчка и действие. В общем переделал код, спасибо за пояснения. Улучшил еще вывод зп как по мне, сразу видно из чего составляется зп
>>450926 Ну у тебя должен быть настроен apache + php и все это должно быть запущено далее php код в файле должен стоять внутри <?php ... ?> И тогда ты просто в браузере открываешь этот свой html файл и у тебя интерпритатор выполняет все.
> в файле extension=php_mbstring.dll раскомменчен В каком файле? Ты уверен что это тот файл который используется как конфиг (посмотреть можно в phpinfo в loaded config file). Сервер перезапустил?
function __construct() { $this->open_connection(); }
function open_connection() { $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->dbname); } } class Student extends Db {
function addStudent($name, $lastname, $pol) { $result = $this->mysqli->prepare("INSERT INTO student(name, lastname, pol) VALUES (?, ?, ?)"); $result->bind_param("sss", $name, $lastname, $pol); $result->execute(); } } $student = new Student(); $student->addStudent("Леонид", "Аристархов", "M");
То всё работает нормально, но если я добавлю пару свой в class Student и напишу там функцию конструктор, всё перестанет работать так как исчезнет подключение к базе данных? В чём проблема? И если я решаю задачу про студентов в стиле ООП, то как кстати лучше делать все параметры студента записывать в свойства объекта, или просто добавлять их в методы как обычные переменные?
>>450986 >но если я добавлю пару свой в class Student и напишу там функцию конструктор Потому что в конструкторе наследника нужно вызывать parent::__construct(). И я не думаю, что тебе нужен класс Db только лишь для подключения к базе данных. Проще и логичнее будет передать базу через конструктор $student = new Student($mysqli).
>как кстати лучше делать все параметры студента записывать в свойства объекта Какие параметры? Если ты про те, что являются полями в таблице, то да.
По поводу задачи про студентов, поясните аноны, вот допустим я передал из формы данные в скрипт, там всё совершилось, в этом случае я так понимаю надо сделать перенаправление на страницу где выводится список студентов, но как его сделать если у меня уже выведена форма? Выскочит же sent by.... или лучше сделать страницу обработчик формы в которой не будет ХТМЛ, но в таком случае в 2 страницы я уже не вложусь, так как их будет как минимум три (там же ещё список студентов)
>>451008 Спасибо >Проще и логичнее будет передать базу через конструктор $student = new Student($mysqli). В этом случае для каждого объекта будет свою подключение?
>>451089 Вызов статического метода класса >Thumbnail Класс >link() Метод >('/image/uploads/1234567.png', 400, 300, Thumbnail::MODE_CROP) Аргументы. Первый очевидно урл, второй и третий размеры, четвертый константа
>>451089 Thumbnail — класс. link — статичный метод класса. В скобках параметры необходимые для работы метода (исходная картинка, ширина превью, высота превью, метод преобразования). Метод должен отдать ссылку на превьюшку.
>>450809 Может это покажется глупо, но я не согласен что в нашем случае object_map не должен менять значения. Возможно он должен возвращать массив, но поменять исходные значения он тоже должен, иначе в будущем будет не удобно вызывать новые свойства через этот массив.
Хорошо, только border добавь. И можешь цвета менее насыщенными сделать? Ты конечно достаточно похоже цвет на глаз подобрал, но там цвета не такие насыщенные. Верстальщик должен уметь пипеткой в графическом редакторе определять цвет, так что потренируйся.
— параметры соединения с БД прописаны в классе — у функций не проставлено private/public — название класса неправильное. можно подумать что класс Student хранит информацию о студенте, но это не так — каждый новый экземпляр Student создает свое соединение с Бд — неясно, а что будет возвращать фукнция чтения студентов из БД? Массивы? Тогда это не очень-то и похоже на ООп
> И если я решаю задачу про студентов в стиле ООП, то как кстати лучше делать все параметры студента записывать в свойства объекта, или просто добавлять их в методы как обычные переменные? Лучше прочитать урок по ссылке и сделать как там советуется, либо сделать по-другому, но аргументировать почему и какие преимущества у твоего подхода.
Студент наследуется от БазыДанных. Это как? Студент — это улучшенная версия БазыДанных? Это показывает что ты неправильно выбрал названия для классов. Например класс Db правильнее назвать DbConnector а Student как StudentDbConnector или как-то так. Ну а еще лучше переписать нормально.
> в этом случае я так понимаю надо сделать перенаправление на страницу где выводится список студентов, но как его сделать если у меня уже выведена форма? Не надо спешить выводить форму. Ты урок по работе с формами читал? https://github.com/codedokode/pasta/blob/master/forms.md
> но в таком случае в 2 страницы я уже не вложусь, так как их будет как минимум три (там же ещё список студентов) ну и пусть.
> Может это покажется глупо, но я не согласен что в нашем случае object_map не должен менять значения Суть функции array_map в том что она создает новый массив (на основе пропущенных через функцию значений). Зачем она должна менять исходный? Какая от этого польза? Приведи пример как ее можно использовать?
От этого только появляются лишние побочные эффекты.
Вот мой пример использования array_map. на вход она получает массив студентов, на выходе дает массив фамилий:
Если тебе надо поменять объекты в массиве, лучше для этого сделать отдельный метод например each или iterate для этого. Он разумеется ничего возвращать не должен.
> иначе в будущем будет не удобно вызывать новые свойства через этот массив. Вызывать свойства через массив — это как?
> public static function object_filter(callable $c, $objects) { Зачем передавать $objects если мы можем использовать $this и сделать метод не статическим? Ты пытаешься сделать отдельный набор функций, в то время как мы можем просто расширить класс нашими методами. Кроме редких случаев, статические методы в ООП это неудобно.
> object_filter Давай называть как принято в PSR, без подчеркиваний.
> SplObjectFunctions Я бы назвал по-другому, например, ExtendedSplObjectStorage или как-то так.
> Клавиша shift А что с форматированием? Где оступы? тяжело же читать. Надо через phpformatter прогонять либо использовать редактор умеющий форматировать код.
> mb_substr($text,1,mb_strlen($text)) Третий аргумент можно не указывать если тебе нужен текст до конца строки.
> $arr = preg_split("/ /",preg_replace("/,/u","",$value),0,PREG_SPLIT_NO_EMPTY); Это лучше на 2 строки разбить, слишком много в одной строке
> "/,/u","" > "/ /" Если тебе не нужна мощь регулярных выражений, лучше использовать explode и str_replace.
Так, работает верно.
Числа-прописью
А что с выравниванием кода? Надо через phpformatter пропустить.
> if(preg_match("/^1$|21|31|41|51|61|71|81|91/", С числами надо работать с помощью математических функций, а не строчных.
Это просто, вот 2 волшебных команды:
// получить последние 3 цифры числа: echo 1234567 % 1000; // выведет 567
// получить число миллионов echo floor(1234678 / 1000000); // выведет 12
Комбинируя их, можно получить что угодно.
> && $word1=="тысяча" Если тебе надо использовать женский род то лучше передавать отдельный параметр, который отвечает за это, а не пытаться угадывать по слову.
> 21|31|41|51|61|71 Это можно записать намного короче. делал ли ты задания на регулярки?
> $number-$thousand У тебя это раз 5 встречается — значит надо сделать переменную, а не копипастить.
> ($number - $millions*1000000) Тут надо применить деление с остатком %
Также, у тебя там местами не один, а два пробела между словами. Один из вариантов — собирать фразу не в переменной-строке, а в переменной-массиве куда класть по одному слову или фразе за раз.
Но хорошо бы уметь чтобы например при правке кода не ломать костылями верстку которую делал верстальщик. Да и разве это долго? С нашими заданиями на CSS/HTML ты недели за 2-3 научишься неплохо верстать.
>>451170 >Суть функции array_map в том что она создает новый массив (на основе пропущенных через функцию значений). Зачем она должна менять исходный? Какая от этого польза? Приведи пример как ее можно использовать? Например, в прошлой задаче с вектором было необходимо поднять начальную зарплату некоторым сотрудникам. Как раз в этом случае был бы полезен такой способ.
>Вызывать свойства через массив — это как? Ой. Ну я имел ввиду, что новые значения свойств сложенные в массив, то есть вот так:
$property = $object->property; $array[] = $propery x 2;
Согласись, что если бы нам в будущем понадобилось свойство propery с новым значением, было бы удобней вызвать его с помощью класса(с помощью метода или напрямую), чем писать = array[0]; По крайней мере мне кажется, что было бы удобней через класс.
Прошу прощение за то что неясно выразился в начале. Надеюсь сейчас я более менее ясно понятно.
> Например, в прошлой задаче с вектором было необходимо поднять начальную зарплату некоторым сотрудникам. Как раз в этом случае был бы полезен такой способ. Для этого есть другая функция: array_walk (в разных языках и библиотеках она называется each, forEach, iterate). Сделай и ее тогда.
> Согласись, что если бы нам в будущем понадобилось свойство propery с новым значением, было бы удобней вызвать его с помощью класса(с помощью метода или напрямую), чем писать = array[0]; По крайней мере мне кажется, что было бы удобней через класс. В таком случае нам не нужен map вообще, просто делаем
>>451170 >В таком случае нам не нужен map вообще, просто делаем > >$object = $storage[0]; > >И в любой момент обращаемся к $object. Ну а если у нас будет тысяча объектов в SplObjectStorage и всем им надо поменять какое-то свойство? Как раз для этого и подошел мой способ.
Если честно, то мне кажется что моя функция objectMap не очень подходит для ООП. Может в каких-то редких случаях и пригодилось бы, но это уже были бы какие-то индивидуальные случаи. Если использовать её как клон array_map, то ты прав - она должна возвращать массив с новыми значениями. Но зачем нам этот массив если мы используем ООП? Поэтому я и говорю она не очень подходит для ООП, IMHO.
В mysql БД передаю текст статьи, статья пишется через CKEditor, поэтому абзацы уже разделены тегом p.
На главной нужно сделать предпросмотр статей на главной (просто чтобы только первый абзац статьи выводился), поэтому хочу в отдельное поле БД сохранять этот первый абзац и его выводить в качестве предпросмотра. Как этот первый абзац отделить от всего текста (он ограничен тегом p) чтобы записать его в отдельное поле?
знак "равно" в html-коде не отбивают пробелами, маня. не то чтобы это не работает, хоть пять их туда въеби - браузер сожрет любое говно. просто не красиво
>>451310 >Как этот первый абзац отделить от всего текста (он ограничен тегом p) чтобы записать его в отдельное поле? Но зачем? Читай уроки опа, там есть, например, такая замечательная штука, как регулярные выражения, с их помощью можно выводить только тот кусок текста, который тебе нужен (в данном случае от начала до тега p - /*<p>/). И не надо будет городить отдельное поле. Впрочем, если сильно хочешь, то можно и так, абзац отделишь с помощью тех же регулярок.
Я поставил php на компьютер, как мне сделать, чтобы как в школе в паскале писать в консоль, и программа это читала? Нужно использовать стандартные потоки ввода-вывода, скорее всего, да?
>>451355 P.S. Может быть, проблема в неправильной конфигурации php.ini? На всякий случай: > file_uploads = On > upload_tmp_dir = "/var/www/tmp" > upload_max_filesize = 20M Остальное не трогал.
> Но зачем нам этот массив если мы используем ООП? Массив использовать для хранения коллекции объектов вполне можно, почему нет? в PHP вроде все равно нет объектов-массивов (хотя есть, ArrayObject: http://php.net/manual/ru/class.arrayobject.php )
Плохо когда массивы пытаются использовать как аналоги объектов вроде
Ошибки выводятся? У тебя включено отображение ошибок?
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
Не совсем понял, что требуется в этом задании. Если я задаю max-width: 600px; - при любом меньшем значении min-width - уменьшение окна упирается в max-width, размеры по высоте не заданы, слева margin от 10 до бесконечности - это видимо margin: 0 auto; насколько я понял. http://jsfiddle.net/x2quc8cw/ это явно не то, что нужно, но условия написаны непонятно.
ОП, любитель глобальных переменных с задачкой про поиск маршрута из прошлого треда опять здесь. http://ideone.com/vlwG0X Убрал глобальные переменные, внедрил значение $pathDone по умолчанию, но возникла проблема. Находится только один маршрут, т.е. рекурсия работает, но функция не перебирает все варианты пути из станции. Может у меня глаз уже замылился, не могу найти причину такого поведения, несколько раз пробовал с самого начала переписать, все бестлоку.
Посмотри внимательно. Ты берешь первую точку, рассчиытваешь маршрут через нее и выходишь из функции (return), не проверив путь через вторую, третью и т.д. точки.
Надо по другому. Надо не возвращать первый найденный маршрут , а сложить все маршруты в массив. А потом выбрать из него кратчайший и вернуть.
>>451398 >Надо по другому. Надо не возвращать первый найденный маршрут , а сложить все маршруты в массив. А потом выбрать из него кратчайший и вернуть. Наверное сейчас глупость спрошу, но как заполнить массив внутри рекурсивной функции не применяя глобальные переменные? Я эти переменные изначально для этого и использовал, сейчас идея в том чтобы возвращать маршруты из функции в массив по одному и потом с ними разбираться.
>>451405 Если объявлять массив в функции, он будет обнуляться каждый раз, если вне функции, то надо вводить дополнительный аргумент. Или это допустимо?
> Если объявлять массив в функции, он будет обнуляться каждый раз, если вне функции, то надо вводить дополнительный аргумент. Или это допустимо? Это временный массив. Он нужен только чтобы сохранить найденные пути через соседние точки, выбрать кратчайший и вернуть. Зачем его сохранять?
загружать лучше на gist.github.com (можно хоть перетаскиванием). А если ты осилишь Github Pages то можешь даже сделать чтобы сайт в браузере можно было просмотреть: https://pages.github.com/
Чтобы загрузить сайт на github pages, надо создать на гитхабе репозиторий, склонировать его к себе, добавить туда файлы и запушить на гитхаб. То есть надо пользоваться гитом. Вот тебе книжка в помощь:
Если ты под Windows и устанавливаешь msys git то командная строка git bash имитирует линуксовую, а не виндовую, и тебе надо читать именно про нее (про линуксовую комнадную строку).
ОП, а как безопасно загружать файл на сервер? Мы в прошлый раз вскользь коснулись вопроса, но не стали вскрывать эту тему. Например, если пользователь вместо картинки подгрузит php или js-скрипт. Как себя обезопасить? Я прочитал статьи на хабре http://habrahabr.ru/post/44610/ http://habrahabr.ru/post/44615/ Но панацеи там не обнаружил. >Лучше всего не давать пользователям обращаться напрямую к загружаемым файлам. Это может быть сделано путем хранения загруженных файлов за пределами корня сайта или запрещая доступ к данной директории с помощью конфигурации веб-сервера. Не понял, разве это обезопасит, если я вынесу upload в директорию выше? Чужой скрипт на сервере, уже неприятно. Запрет доступа вообще бессмысленный. Допустим, в Yii к директории protecred нельзя обратиться, так и картинка не будет отображаться в браузере, если я туда сохраню. >совершенно невозможно обеспечить безопасную загрузку файлов на сервер без ущерба для неё. врети, быть такого не может
Может, переименование файла спасет? $filename = md5(microtime() . rand(0, 9999)); Тут гарантируется уникальность имени? Или хакир все равно вычислит свой высер по хеш-сумме?
Что то я несовсем вехал во взаимодействие yii2, композера, и папки Vendor.
Yii2 имеет свою определенную структуры каталогов и она сразу скачивается композером вместе с начальным шаблоном и лежит всё это дело в вендор, в руководстве и туторе же рассматривается случай когда всё скаченно в ручную и предлагается работать сразу со скаченными каталогами.
А что должен делать я в случае использования композера, создавать такую же структура, как та что в вендоре, но новую и просто подключать в неё yii2 никак не меняя содерживое вендор?
>>451513 А вообще? С учётом того, что с погромированием знаком только по школе (сдавал ЕГЭ по информатике). За какое время реально въехать и устроиться на работу, при условии, что относительно неглуп? ДС.
Это плохая идея, резать HTML регулярками. Она ведет к разным ошибкам. Нужно использовать библиотеку, понимающую структуру HTML, например DOM + XPath для вырезания.
Ссылка не открывается (We seem to have missed the gist of that gist you were looking for). Могу посоветовать поставить var_dump для $_FILES и всех переменных которые исопльзуются чтобы посмотреть в чем дело. на линуксе так же может быть проблема с правами, но если ты включил отображение ошибок то увидишь сообщение.
Тут рамки не хватает, но ладно, можешь ее не делать, переходи к следующему заданию. И вообще не жди меня, можешь сразу несколько заданий делать дальше.
— Нету DOCTYPE. Это значит что браузеры переключатся в режим совместимости с написанными в прошлом тысячелетии сайтами (Quirks mode) и будут отступать от стандартов при отображении страницы. Читай
Символы < > & надо писать через них. Делал ли ты 3-е задание из «Пути HTML»? Если пропустил то зря. Там все задания важны.
Кстати в Sublime эта ошибка подсвечивается красным.
> HOME</a> заглавные буквы надо делать средствами CSS, а в тексте писать нормально.
> <p><h2>Consectetur</h2> Нельзя ставить h2 внутрь p. Как заголовок может быть внутри абзаца текста?
> id="featuredworks" Старайся не исплоьзовать id в верстке. Они неудобные, так как их нельзя повторно испльзовать и ставить несколько id на один элемент.
> id="imagecontainer" В CSS обычно используют минус для разделения слов: image-container. Также тебе наверно будет интересно и полезно почитать про подход к составлению названий классов под названием БЭМ:
> <div id="telephone"><p>0247 541 65 87</p></div> > <div class="copyright"><p> зачем тут тег <p>? По моему он лишний. Тег <p> обозначает абзац в тексте. Но тут у тебя явно абзацев нет, просто кусочек текста.
> <p>Vestibulum id ligula porta felis euismod semper, malesuada euismod.</p></div> Лишний </div>
HTML код у тебя оформлен неудачно. Местами выравнивание нарушено и трудно понять какой тег куда вложен.
По самой странице. Она у тебя фиксированной ширины. Что за ерунда? Это не годится для нашего треда. Все должно тянуться. У людей разные браузеры и разные экраны.
Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать переключаемыми при нажатии за счет CSS3 (или яваскрипта).
Пункты меню и кнопки должны реагировать на наведение мыши. У тебя на кнопке See portfolio активна только надпись, а кликать по краям бесполезно. Почему? Неудобно же.
Кнопки соцсетей должны быть ссылками и реагировать на наведение.
Логотип должен быть ссылкой
> font-family: 'reklame_script_regular_demoRg'; Название лучше было бы нормально записать, например Reklame-Script-Demo. Глаз спотыкается об подчеркивания и остутствие заглавных букв.
> body{ > width: 1663px; Это неправильно. На узких экранах появляется прокрутка, на широких все смещено влево.
> font-size: 25px; Когда задаешь font-size надо задавать line-height.
> .slider span Плохая идея использовать span в селекторе. Завтра верстальщик добавит еще span и твои стили на него применятся.
В логотипе буква W неправильно выровнена относительно надписи.
Высота хедера у тебя меньше пикселей на 15 чем на макете, текст в меню крупнее.
Под кнопкой «See portfolio» значительно меньший отступ чем у тебя. Важно соблюдать пропорции и отступы. На макете отступ под и над кнопкой одинаков, а у тебя нет.
Надпись «digital&branding agency» другого размера.
> nav > word-spacing: 50px; Что если пункт меню будет из нескольких слов? Например, если меню правится через админку.
На макете «Consectetur» написано шрифтом без засечек, у тебя с засечками.
Надпись «Curabitur blandit tempus portitto» не такая бледная.
Кнопки «ALL GRAPHIC ILLUSTRATION MOTION» меньше чем у тебя.
Отступы под портфолио и в подвале не совпадают с макетом.
images/sprite3.jpg по моему сжат некачественно, видны артефакты сжатия. тут вообще наверно лучше PNG было применить.
У иконки андроида слева в руке какая-то полоска. Иконка с монитором обрезана сверху.
Когда делаешь спрайт, надо оставлять промежутки пикселей по 5-10 между картинками для защиты от ошибок и багов при масштабировании страницы. Для images/sprite2.jpg наверно лучше использовать PNG так как там мелкие детали и четкие границы. Тут по моему для всех картинок (кроме портфолио) лучше PNG использовать так как высокий контраст и мелкие иконки. Плюс, в PNG можно использовать прозрачность что облегчит например смену цвета или рисунка фона.
Названия картинкам лучше давать нормальные. Как догадаться что внутри sprite1.jpg?
> Я правда не разобрался как размер шрифта определять в псд, поэтому наверное так криво получилось.
Берешь Text tool и щелкаешь один раз на текст. На панели текста появится размер и стиль шрифта. если панель не видна, открой ее через Window - Character.
Ну и сделай чтобы макет тянулся, например от 1024 до 1600. Если экран меньше то появляется линейка прокрутки, если больше то поля с краев а сайт центрируется (для этого достаточно правильно min/max-width поставить).
Запустить код на сервере злоумышленник может только в 3 случаях:
1) он загрузил файл с расширением котрое вызывает подключение php интерпретатора напрмиер file.php
2) он загрузил файл в котором одно из расширений это php: file.php.rar (прикольная фишка Апача, правда? с ее помощью можно обходить проверку по рсширению)
3) он загрузил .htaccess файл
Решения:
- проверка расширений файла, например если ты принимаешь только картинки то проверяй расширение на список допустимых
- не пропускаем умников пытающихся загрузить file.php.rar
- загружаем файлы на отдельный сервер где не установлен php, а есть только nginx который не выполняет ни php код ни читает htaccess (так вроде делает вконтакте)
Теперь подумаем какие файлы несут нам угрозу:
- php файлы: запустив их злоумышленник выполняет любой код на сервере и полностью его контролирует - htaccess файлы: злоумышленник может менять настройки сервера и делать что хочет - html файлы: так как эти файлы находятся на одном домене с твоим сайтом то JS код в них может делать любые действия от имени пользователя, обходя в том числе CSRF защиту (он сможет прочитать CSRF токен из тела страниц на твоем сайте). Злоумышленник должен загрузить HTML файл и как-то заманить пользователя его открыть. Решение: загружаем пользовательские файлы на отдельный домен. Так делает Гугл ( http://whois7.ru/?q=googleusercontent.com ) и гитхаб ( http://whois7.ru/?q=http://githubusercontent.com/ ). Либо не принимаем html.
JS файлы угрозы не несут так как JS код не выполняется на сервере.
> Запрет доступа вообще бессмысленный. Допустим, в Yii к директории protecred нельзя обратиться, так и картинка не будет отображаться в браузере, если я туда сохраню. Верно.
> Может, переименование файла спасет? > $filename = md5(microtime() . rand(0, 9999)); > Тут гарантируется уникальность имени? Это плохая идея так как у тебя будет куча файлов с бессмысленными именами и ты сам не поймешь где что.
> Или хакир все равно вычислит свой высер по хеш-сумме? Может быть у тебя где-то будет выдаваться имя файла, и хакер его найдет. Это не защита.
В общем, мне кажется, надо проверять расширения. Если ты принимешь картинки то только несколько разрешенных расширений, если любые файлы то принудительно ставь им например расширение .txt и убирай остальные точки из имени. Ну и запрети выполнение php кода в папке.
проверять будут не сколько ты учил, а что ты знаешь. Обычно просят сделать небольшой сайт, также могут спросить какие библиотеки и фреймворки знаешь. А сколько ты времени потратил никого особо не интересует.
Я бы рассчитывал на полгода-год вдумчивого старательного изучения.
Раньше Юи нельзя было поставить через композер из-за запутанной структуры папок (фреймворк и пользовательский код были перемешаны) и старые туториалы использовали вариант когда ты руками скачиваешь и распаковываешь архив.
В новом Yii эта проблема решена. Те каталоги в которых ты кладешь свой код, делаются вне vendor.
Композер склонирует этот проект в корневую папку, а зависимости (в том числе ядро Yii) в vendor.
Заметь что там уже нет папки protected: контроллеры лежат прямо в корневом каталоге.
> в руководстве и туторе же рассматривается случай когда всё скаченно в ручную и предлагается работать сразу со скаченными каталогами. По моей ссылке рассматривается композер.
> А что должен делать я в случае использования композера, создавать такую же структура, как та что в вендоре, но новую и просто подключать в неё yii2 никак не меняя содерживое вендор?
> public function getLeader() { Возвращает массив. Что за ерунда? Функция называется getLeader, а не getLeaders, верно? Значит она не должна возвращать массив.
Да и может ли быть 2 босса в департаменте? Если да то перименуй функцию и переделай весь код который ее использует на многобоссовый режим. Если нет то возвращай один объект, а если лидеров окажется больше, выкинь какое-нибудь spl-исключение.
> public $name; закрой свойства от прямого доступа. У тебя же много замечательных методов имеется.
> return $f->getLeader() == true; Можно просто return $f->getLeader(); он же true/false возвращает?
Ну и getLeader на рабочем правильнее назвать isLeader. Функции возвращающие true/false обычно называют isSomething()
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Ну и учитывая что это используется только в getLeader, от этой функции вообще можно было избавиться. Можно и оставить, впрочем.
> ?> Не ставь это в конце
> throw new Exception('Incorrect rang'); Лучше писать тут же чему равен ранг. Тогда отлаживать ошибку будет проще. делай помогающие сообщения об ошибках.
> public function secondAnticrisisMethod( Тут надо сделать проверки вроде: если подходящего кандидата нет, не меняем лидера
Смену лидера надо бы сделать методом в департаменте. А у тебя колхоз какой-то: вручную снимаем статус, вручную ставим.
Ты тут не используешь наследование, а вообще с помощью наследования можно было бы не указывать зарплату через коснтруктор (а прописать ее в классах Инженера, Менеджера и тд).
> firstAnticrisisMethod('engineer'); Название надо сделать константой вроде Employee::JOB_ENGINEER. А то у тебя какие-то мутные строки, легко опечататься, непонятно каке вообще профессии существуют.
>>451705 >А когда ты дампил он был не пуст. Не понял. Как такое могло случиться? Я не правильную функцию подобрал? reset же не совсем преднозначен для получения первого элемента. Может сделать просто $newLeader = $filteredEmployees[0]?
>(а прописать ее в классах Инженера, Менеджера и тд). У меня нету таких классов. Есть общий класс Department, и при добавлении сотрудника указывается все через коснтруктор. Не понял, как ты имел ввиду унаследовать чтобы избежать этого? ʃ(˘▽ƪ)
> firstAnticrisisMethod('engineer'); Название надо сделать константой вроде Employee::JOB_ENGINEER. А то у тебя какие-то мутные строки, легко опечататься, непонятно каке вообще профессии существуют. А можно пример или подсказку как это реализовать? Не совсем понял просто. Что такое константы я, вроде, знаю, но такой метод записи вижу первый раз. (◡‿◡)
>>451697 >заглавные буквы надо делать средствами CSS Это как? Не нашел такого свойства. >На макете «Consectetur» написано шрифтом без засечек, у тебя с засечками. Не знаю, я использовал шрифт Lato, а там используются какие-то различные его разновидности, Lato black, Lato light. >Надпись «Curabitur blandit tempus portitto» не такая бледная. Я пипеткой цвет взял из макета.
Я так понял в задаче про студентов обязательно надо запомнить id человека который уже зарегестрировался, что бы потом вывести по этому id форму для редактирования. Запомнить id я так понимаю можно через куки или сессии, лучше через куки, но вот стоит ли писать id в куки, это не является угрозой для безопасности? Или их надо просто зашифровать каким-нибудь образом? Задание же не предусматривает авторизацию?
Пытаюсь решить задачу про кошек-мышек. Принцип такой: поле представляет собой массив [1...n^2]. Метод класса "Animal" setPosition(array closedPositions) будет гарантировать уникальность случайного выбора, чтобы не получилось, что несколько животных могут появиться на одной и той же позиции. Также в этом классе прописаны методы, которые будут находить ортогональные клетки, возможные с текущей позиции (find(Right | Left | Down | Up)Cell); есть метод, который будет исключать закрытые позиции (например: если рядом на клетке уже стоит животное того же вида) exludeClosedPositions(array sameSpeciesPositions); метод, который будет оценивать каждый из возможных шагов calcStepsPrices(array $enemiesPositions), используя вспомогательные методы findClosestEnemy(array $enemiesPositions) и calcStepPrice(). и абстрактный метод makeStep(). Класс "Mouse" будет добавлять метод расчета поля видимости 9*9 findVisibleField(), потом родительский метод calcStepsPrices(array $enemiesPositions) будет переписан так, что будет проверка пересекаются ли массивы $enemiesPositions и массив поля видимости, возвращаемый методом findVisibleField(). Если пересечение будет, то в makeStep будет выбран наиболее лучший ход (чтобы расположиться дальше от кота), если нет будет сделан случайный ход. Класс "Cat" будет добавлять диагональные шаги и делать ход самый ближайший к мышке. Также там будет счетчик ходов и свойство, хранящее позицию мыши. Если позиция кота и мыши совпадут ($this->position === $this->enemyPosition или счетчик будет картен 8) то метод sleep() вернет true. Метод makeStep() будет изменять $this->position и вернет отрицательное значение текущей позиции если кот спит. Ну и класс "Field", который будет хранить массив поля и строковое представление поля. Если позиция кота отрицательная, будет выведен символ "@". Есть также методы resetCatsPositions()/resetMousesPositions() которые будут учитывать обновление позиций. Укажи, пожалуйста, где, что не так с таким решением. И еще интересует вопрос, как удалять мышей (в моем решении это будет делать метод класса "Field" removeDeadMouses())? Достаточно ли будет их убрать из массива в классе "Field" или надо придумывать что-то связанное с __destruct()? Мне не нравится, что класс "Field" хранит в себе объекты мышей и котов, хотя в основном оперирует их позициями. Но с другой стороны, как-то нужно удалять мышей, обновлять текущие позиции. В общем, боюсь, что наделал кучу каких-то сложностей, ОП, ткни в них носом. Заранее спасибо.
Иногда в новостях можно услышать, что тот или иной школьник из Британии или Вьетнама написал приложение которое стало одним из самых популярных и его теперь использует например Амазон, приложение которое например помогает читателю понять стоит ли ему читать ту или иную новость, ну например вот http://www.macdigger.ru/iphone-ipod/kak-britanskij-shkolnik-prodal-yahoo-za-30-mln-prilozhenie-dlya-iphone.html. Можно ли писать подобные приложения на ПХП?
>>451886 Хм, действительно. Благодарю. Но если не стоит цели делиться ссылками после запроса, то можно и не использвать ГЕТ для чистоты адресной строки?
>>451889 >>451890 Я почему спрашиваю: сейчас у меня поиск ГЕТом и в адресной строке вот такая хуерга "test.com/?search=слово&submit=" Мне это все не нравится, я и допустим хочу сделать красиво "test.com/слово". Если использовать ПОСТ, то этого не добиться, правильно? А как добиться этого ГЕТом?
>>451900 http://winginx.com/ru/docs/rewrites >Как уже знаем, в nginx не существует апачевского .htaccess, где можно было бы настроить правила для столь популярного mod_rewrite, собственно mod_rewrite — это модуль именно для Apache...
>Но не стоит расстраиваться! У nginx есть свой модуль — ngx_http_rewrite_module. По моему скромному мнению, модуль rewrite у nginx более гибок, понятен и прост в освоении, нежели mod_rewrite у Apache. Хотя, оба требуют особого понимания работы системы «ревратов» для написания правил :)
Если кто-то сходу знает как на index.php из этого "test.com/?search=слово&submit=" сделать это "test.com/слово", то прошу помочь. А то выглядит все реально очень плохо.
>>451905 На большинстве сайтов так все и выглядит обычно. К чему такая срочность? От тебя по работе это требуют? Если чисто для себя, то почему бы не выучить реализацию ЧПУ самому?
Аноны, есть одна статья про арканоид - http://habrahabr.ru/post/116860/ где описывается создание простенького пинг-понга. Начав ковырять код этой игрушки, наткнулся на один баг(?) - если мячик подлетает к ракетке игрока сверху/снизу, он проходит сквозь нее, а не отскакивает, как положено. Функция collision() срабатывает (я тестил), и, кажется, я догадываюсь в чем глюк, но все равно не знаю, как правильно нужно переопределять координаты мяча, если он подлетает снизу или сверху ракетки. Я знаю, что многим тут влом будет вникать, но все же оставлю измененный код (увеличил только длину ракетки для наглядности), где этот баг виден.
>>451906 Нет, не работа, все для себя. Но учить что-то сильно специфическое и сложное, что больше никогда не пригодиться, не очень хочется. Просто я не программер, но сайт свой имею/делаю
> Не понял. Как такое могло случиться? Я не правильную функцию подобрал? reset же не совсем преднозначен для получения первого элемента Если массив пустой как тебе поможет reset? Использовать [0] конечно лучше если в массиве ключи идут по порядку.
> Не понял, как ты имел ввиду унаследовать чтобы избежать этого?
$manager = new Manager($rank); $engineer = new Engineer($rank);
> а там используются какие-то различные его разновидности, Lato black, Lato light. дело не в этом. Посмотри инспектором в браузере верстку или посмотри что пишет валидатор.
Если линия буквы частично попадает в пиксель то он закрашивается лишь частично. Ты можешь увидеть это, сделав большой масштаб (например 800%) и увидишь что пиксели имеют разную яркость.
Обычно цвет можно взять из свойств текста в фотошопе, но тут шрифт тонкий и он кажется из-за этого бледнее. лучше всего подобрать цвет на глаз, там всего 256 градаций серого.
В чем смысл использовать пост? Все используют гет, а ты особенный? Просто традиционно гет испльзуется для запросов не изменяющих состояние сервера и я не вижу причины делать наоборот. Ну и ссылкой можно поделиться или сохранить в закладки, что удобно. Также можно вернуться на страницу результатов кнопкой назад. Я не понимаю почему ты хочешь лишить пользователей удобства.
> Мне это все не нравится, я и допустим хочу сделать красиво "test.com/слово" Это можно сделать, редиректом например но это довлоьно бессымсленная затея. Во-первых, что если пользователь введет кроме слова еще какие-нибудь символы. Что если он введет index.php? По моему это бессмысленное усложнение которое не дает никакой выгоды.
Да и в современных браузерах часто query string параметры вообще не выводятся пока не щелкнешь по адресной строке.
Красивые URL лучше сделать для обычных страниц а не для результатов поиска. В моем понимании красивые URL это соответствующие концепциям HTTP/REST, и эти концепции не требуют результаты поиска делать отдельными страницами.
Никакая форма не будет отправлять данные приписывая их к URL. ты должен либо делать это яваскриптом либо принимать запрос и редиректить.
Также ты должен продумать схему кодирования слов в URL. чтобы избежать конфиликтов и неодноначностей.
Ну и я вспомнил — некоторые сайты так делали, но они делали это ради того чтобы создать видимость что у них много страниц и занять более высокое место в поисковиках. Не уверен что этот трюк работает в наши дни.
>>451970 Я почему-то думаю, что это кнопка дописывает, так как именно она у меня имеет соответствующие атрибуты. Но я не знаю, как сделать кнопку по-другому. <button class="..." type="submit" name="submit">
Так, я понял, откуда у меня добавляется в URL &submit=. Все дело в атрибуте кнопки name="submit". Но проблема в том, что если убрать этот аттрибут, то кнопка перестает работать. Короче, какие-то очередные тонкости использования форм, о которых не пишут в обычных мануалах. Но вопрос остается открытым, буду им бампать пока не поможете, лол) Я же знаю, вы догадываетесь, в чем проблема.
>>451987 >>451988 Вау! А выше мне говорили совершенно другое, хотя я начал свои рассуждения именно с POSTа: >В чем смысл использовать пост? Все используют гет, а ты особенный? Просто традиционно гет испльзуется для запросов не изменяющих состояние сервера и я не вижу причины делать наоборот. Ну и ссылкой можно поделиться или сохранить в закладки, что удобно. Также можно вернуться на страницу результатов кнопкой назад. Я не понимаю почему ты хочешь лишить пользователей удобства. Как насчет определиться, ребят?
>>451989 Не слушай меня, я херню несу. У тебя кроме сабмита там должно еще поле быть. Нужно делать isset на него, а не на сабмит, тогда и атрибут можно будет убрать. Допустим у меня в форме: <input type="text" name="search" value='значение'>
<input type="submit" value="Поиск">
А в коде у меня проверка if (isset($_GET['search']) а не по сабмиту
>>451995 Сработало. Я тоже думал о таком варианте раньше, но с точки зрения нормального программирования listner на текстовом поле должен срабатывать каждый раз, когда ты вводишь или удаляешь один символ. А здесь разве не так? Разве не после каждого введенного символа срабатывает все, что находится
>>452000 Ничего не срабатывает пока ты не отправляешь форму. Пхп скрипт выполняется один раз, при заходе на страницу, потом только когда ты её обновишь. Когда жмешь сабмит, заголовки вместе с тем, что ты написал в поле отправляются на сервер и обрабатываются им и он отправляет уже новый хтмл код.
От других уязвимостей это не защищает. Вывод на страницу яваскрипта - это XSS и от нее надо защищаться по другому, на этапе вывода данных а не при вставке в базу. У меня есть урок по XSS
>>451703 >проверять будут не сколько ты учил, а что ты знаешь. >Обычно просят сделать небольшой сайт, также могут >спросить какие библиотеки и фреймворки знаешь. А >сколько ты времени потратил никого особо не >интересует. >Я бы рассчитывал на полгода-год вдумчивого ста
Так нужно будет перед этим html/css учить или нет?
Ни одной итерации не проходит. Хотя если вместо цикла поставить <?= htmlspecialchars($results[0], ENT_QUOTES) ?>, то выводит результат просто замечательно, как и <?= htmlspecialchars(count($results)) ?> показывает ненулевое число. Я в замешательстве.
и да, я знаю, что есть foreach, но конкретно здесь мне нужен обычный for
>>452053 Да ебаный в рот. Это макака вырезает, а не я неправильно скопировал. Там в теле цикла у переменной results естественно стоят квадратные скобки с переменной "i" внутри. Почему-то здесь они просто вырезаются.
>>452077 а, ну тогда да норм. сколько пыхой занимаешься? у меня аналогичная ошибка была полгода назад просто (с $ в скобках), заебался читать про ООП, впервые зашел в этот тред вообще тут совсем начинающие или как?
>>452080 Пару дней уже занимаюсь. Я просто раньше с джавой и сишкой работал, вот и невнимательно написал в скобках. Но вообще такие ошибки должны выдавать хоть какие-нибудь warning'и, а у меня все ок на вид было.
>>452086 Мэтт Зандстра - PHP, Объекты, шаблоны и методики программирования
На самом деле книжка очень ок, но голова спустя полгода говнокодерства в процедурном стиле крайне тяжко воспринимает ООП. Хотя всю теории по классам уже знаю.
Хочу вот дочитать её, и перекатиться в какой-нибудь фреймворк с MVC парадигмой.
После хочу вкатиться во фриланс с версткой (вчера открыл задания по хтмл+ксс, сверстал сразу макет из 10ого задания, удивился что чето умею), джаваскриптом и пыхой
> Но вообще такие ошибки должны выдавать хоть какие-нибудь warning'и, а у меня все ок на вид было. Они выдают, просто ты их зачем-то отключил (или не включил).
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
> лучше через куки, но вот стоит ли писать id в куки, это не является угрозой для безопасности? Лучше использовать не легкопредсказуемый id, а сложный случайный код. ты комментарии к заадче читал ?
На мой взгляд схема усложненная, с лишними полями и методами.
> поле представляет собой массив [1...n^2] Вообще необязательно делать массив.
> Также в этом классе прописаны методы, которые будут находить ортогональные клетки, возможные с текущей позиции Вместо того чтобы делать 8 методов наверно лучше сделать один метод вроде получитьВсеВозможныеХоды().
Непонятно почему fieldSize является свойством животного. Это как? Бывают кошки с fieldSize = 10, а бывают с 12?
pricesOfSetp и possibleSteps по моему нет смысла делать полями в классе. Зачем? Они на следующем ходе становятся неактуальными, зачем их хранить?
Не очень понятно зачем массив catsPositions если координаты кошек и так хранятся в каждой кошке. Зачем дублировать?
Соответственно непонятно зачем методы работы с этими координатами.
Метод setPosition можно убрать. Координаты животного можно генерировать извне.
Мне кажется вместо 2 методов addCat/Mouse лучше сделать один а то добавив еще 10 видов животных мы устанем добавлять методы.
Непонятно зачем нужен removeDeadMouses. Они сами собой удаляться с карты не могут?
> что будет проверка пересекаются ли массивы $enemiesPositions и массив поля видимости, возвращаемый методом findVisibleField() тут по моему незачем делать массив видимости, если есть координаты и радиус легко проверить входит точка в него или нет.
> Достаточно ли будет их убрать из массива в классе "Field" или надо придумывать что-то связанное с __destruct()? Достаточно убрать.
> Мне не нравится, что класс "Field" хранит в себе объекты мышей и котов Почему? Животные находятся на Карте. Значит Карта должна знать кто на ней находится.
также я не уверен нужно ли в Кошке хранить enemyPosition? Кошка всегда гоняется только за одной мышью или каждый ход выбирает ближайшую? Если второе то зачем хранить это свойство?
Если ты скопировал чей-то код то спрашивать почему он не работает надо у автора, а не у меня.
Я могу посоветовать воспользоваться отладчиком яваскрипта, который позволяет тебе остановить программу в любом месте, просмотреть и даже поменять знаечние любой переменной. Он встроен и в хром, и в Фаерфокс: http://habrahabr.ru/post/143767/
> const THUMBS_URL = "http://site.local/thumbnailier/thumbs/"; Константы не для настроек. Вот скачаю я твою библиотеку. Как мне поменять адрес сайта не трогая код?
Это надо сделать в переменныех, которые например передаются в конструктор. Или вообще использовть относительные ссылки. И разумеется вынести наружу из класса.
> public static function link($imgSourcePath, $width, $height, $mode) Эта функция не должна ничего делать с картинкой. Это же медленно. Она должна лишь создавать ссылку, а картинка генерируется при обращении по этой ссылке.
ну и у тебя есть 10 раз вызвать link() то 10 раз сгенерируется превьюшка даже если она давно уже есть на диске. Это неэффективно.
Насчет задания, я бы советовал не использовать статические методы (хотя они использованы в задании). Это была неправильная идея с моей стороны, сделать все на статических методах. лучше сделать нормально, тогда мы можем например создать 2 объекта с разными настройками.
Аноны, может баловался кто написанием facemash'a на пыхе?(Сайта, где надо выбрать лучшую фотку тянки их 2-ух, как в том фильме про цункенберга)Охота посмотреть на исходники и попробовать нечто подобное, дабы стать популярным в своем мухосранске
>>452149 Но я же принтовал его самостоятельно (через print_r($newLeader) только) и он у меня выдал >>451696 >Employee Object ( [name:Employee:private] => analyst [rang:Employee:private] => 2 [salary:Employee:private] => 1100 [coffee:Employee:private] => 75 [document:Employee:private] => 5 [leader:Employee:private] => ) Зачем мне тебя обманывать? Я сам хочу понять что я не правильно сделал.
>У тебя это выводится? Это явно ошибка. если не выводится то значит ты зачем-то игнорируешь часть ошибок. Ну я вообще ничего не менял в настройках php, вроде. Значит так по стандарту стоит.
Дайте ссылку где можно посмотреть примеры реализации классов с наследованием (что-то вроде класс "Животные" управляет классами "Птицы", "Насекомые" и "Млекопетающие", а последний управляет классами "Животнородящие" и "Другие"). Нужен конкретный пример на такие вложенные классы.
И еще, ты мне в одном из тредов советовал способ который загружает классы. Не мог бы ты мне напомнить с помощью чего он делается? А то я делаю классы специальностей с наследованием в том же файле, и при создании нового объекта у меня выдается ошибка о том что не может найти такой класс. Уверен, это из-за моего кривого автолоуда: https://github.com/someApprentice/Vector-Com/blob/master/autoload.php
class Animals { public function eat() { //eat something }
public function sleep() { //sleep sometimes }
... }
Class Birds extends Animals { public function fly() { //fly far away }
... }
У класс Птиц получит(унаследует) все методы и свойства класса животных. Если мы захотим что-то унаследовать от Птиц (т.е. Class Something exnteds Birds) то новый класс(Something), скорее всего, унаследует все методы и параметры от Животных и Птиц. Пишу "скорее всего", потому что не уверен что это так, но ты можешь проверить это самостоятельно, но по идее должно быть так.
>>452160 Ну вот поэтому мне и нужен конкретный пример реализации. Лично меня больше всего интересуют не методы, а переменные и как с ними обращаться. Например, могу ли я из созданного объекта класса Животные обратиться к переменной Крылья (хочу узнать, есть ли у конкретного животного крылья)? Также мне не очень понятно, как обращаться с этим всем в связи с БД.
>>452168 С самой БД проблем нет, я вытаскиваю информацию через мапперы и единичные классы. Но теперь мне кажется, что в моем случае нужно сделать несколько управляющих классов, а я не очень догоняю, каким образом эти управляющие классы должны заполнятся из БД.
>>452164 Про твой вопрос с БД, я, к сожалению, ничего не могу подсказать, но с первым вопросом постараюсь помочь.
Возьмем к примеру мой способ выше, за исключением некоторых изменений:
class Animals { public $legs = true; public $wings = false;
public function eat() { //eat something }
public function sleep() { //sleep sometimes }
... }
сlass Birds extends Animals { public $wings = true;
public function fly() { //fly far away }
... }
>могу ли я из созданного объекта класса Животные обратиться к переменной Крылья >хочу узнать, есть ли у конкретного животного крылья Тут ты должен сам решить к чему ты хочешь обратиться, к конкретному классу животного или к просто к классу животных. Вообще через класс Животные не логично обращаться к классу Птиц, например. Гораздо лучше поступть так:
Предок ничего не должен знать про потомков. Нельзя из базового класса (Животное) обращаться к свойствам или методам определенным в наследниках и неизвестных базовому классу.
>>452173 Вот тут не понятно, что делает переменная крылья в животных, хотя она должна быть только в классе птиц: class Animals { public $wings = false; ...
Если на первом пункте еще возникали сомнения, то вот тут $birds = new Birds(); print_r($birds->wings); уже на сто процентов стает ясно, что управляющие классы нахуй не нужны, если мы все равно будем работать с отдельными из них. Тогда возникает следующий вопрос, а зачем тогда работать с Птицами, если можно опуститься еще ниже и работать с самими Крыльями?
>>452176 >уже на сто процентов стает ясно, что управляющие классы нахуй не нужны Нужны, если мы не хотим по 100 раз писать один и тот же код. Например, обрати внимание что я в Классе птиц не писал параметр $legs, потому что он уже унаследовался от класса Животных.
>а зачем тогда работать с Птицами, если можно опуститься еще ниже и работать с самими Крыльями? Это от целей твоей задачи зависит с чем тебе работать лучше.
>>452172 Сейчас у меня все работает с множеством классов, которые никак не связаны. В один момент времени идет обращение к одной таблице, через некоторое время подтягиваяется информация из другой и т.п. Это все очень неудобно, и у меня возникает такое чувство, что это неправильно. Поэтому возможно стоит создать один управляющий класс "Животные" и один большой запрос с сотнями строк в результатах, который сразу же распарсить по переменным в под-классах, чтобы потом обращаться к одному из объектов большого массива Животных. Как-то так. Более конкретно тяжело что-то сказать, ведь я спрашиваю про саму идею (ну и реализацию тоже, да)...
>>452178 >Например, обрати внимание что я в Классе птиц не писал параметр $legs, потому что он уже унаследовался от класса Животных. Но почему тогда переменная $wings не наследуется и ее нужно снова объявлять в классе Птиц?
>Это от целей твоей задачи зависит с чем тебе работать лучше. На сколько смог, попытался объяснить в начале этого поста, что мне нужно.
>>452177 Тогда сделай задачку про компанию "Вектор" в самом конце. Там как раз нужно использовать наследование. Если ты все знаешь ты её быстро сделаешь. Плюс тут тебе подскажут о твоих ошибках, и ты в дальнейшем сможешь их избежать.
>>452179 >Но почему тогда переменная $wings не наследуется и ее нужно снова объявлять в классе Птиц? Она тоже наследуется. Просто в Животных по стандарту она дает ложное значение, а в Птицах мы меняем его на истинное.
Если у тебя много таблиц со связями то может лучше не писать свою реализацию ORM а исплоьзовать готовую вроде Doctrine 2.
> Поэтому возможно стоит создать один управляющий класс "Животные" и один большой запрос с сотнями строк в результатах, который сразу же распарсить по переменным в под-классах
Ерунда какая-то. Животные в схеме DataMapper не умеют сами себя загружать из базы, это делает маппер. И никто не запрещает мапперу взять информацию из нескольких таблиц если они связаны связями, и например загрузить граф связанных объектов. Например загрузить пост сразу с комментариями (хотя имхо это довольно бесполезно так как ты только усложняешь себе жизнь разбором массивов сложной структуры).
ну и подробности конечно из тебя как из партизана на допросе приходится выпытывать.
>>452181 Получается, что если объявить эту переменную в самом верхнем классе с дефолтным значением, то мы сможем к ней обращаться и получим правильное значение, если в нижнем классе точно укажем ее значение?
>>452183 Да, таблиц сейчас десяток. Я, наверное, так и сделаю - почитаю про Doctrine и попробую реализовать.
Ну вот возьмем тот пример, что ты привел - посты на сайте с комментариями. Есть ли смысл создавать один большой класс Post, который будет управлять также классом Comments? Что-то вроде этого:
class Post { public $mainText; ... }
сlass Comments extends Post { public $commentsNumber; public $commentText; //массив public $commentLikes; //массив ... }
>>452185 >Получается, что если объявить эту переменную в самом верхнем классе с дефолтным значением, то мы сможем к ней обращаться и получим правильное значение, если в нижнем классе точно укажем ее значение?
class Animals { public $legs = true; public $wings = false;
public function eat() { //eat something }
public function sleep() { //sleep sometimes }
... }
сlass Birds extends Animals { public $wings = true;
public function fly() { //fly far away }
... }class Animals { public $legs = true; public $wings = false;
public function eat() { //eat something }
public function sleep() { //sleep sometimes }
... }
сlass Birds extends Animals { public $wings = true;
Кажется, я понял, почему я не понимаю сути. Я смотрю на эти классы "сверху вниз", а нужно смотреть "снизу вверху", то есть каждый нижний будет иметь свои профиты от того, что над ним находится класс, в котором уже прописаны базовые методы и переменные. Это так?
>>452154 А у меня результат пикрелейтед. Но! Если раскомметить $newLeader->setLeader(true), то результат будет точно такой же как и у тебя. Как такое может быть?
У меня тоже не получается с наследованием. Я в каждой конкретной специальности прописал в параметрах необходимые значения зарплаты, кофе и документов. И в файле создания департаментов (department.php) изменил добавления сотрудников. А при выводе почему-то все эти значения остаются пустыми.
> сlass Comments extends Post С какой стати Комментарий наследуется от Поста? Комментарий это улучшенный Пост? Это разные сущности и они наследоваться не должны.
И что за «нижний класс»? Это называется предо и потомок (наследник).
Что за «управляющий класс»? Ты какие-то свои термины придумываешь и всех путаешь.
>public $commentText; //массив Непонятно почему текст комментария это массив
У меня ощущение что ты невнимательно прочел урок про работу с Бд и начал выдумывать какие-то свои странные способы.
Исплоьзуй нормальные термины. Если ты про поле wings то в наследнике оно переопределено. И если ты создаешь объект класса birds то оно имеет значение true.
> private $salary = 500; private поле принадлежит только одному классу (а не расшаривается между наследниками) и в каждом классе свое. То есть если ты пишешь
new Manager()
то у тебя там есть независимые друг от друга поля Manager#salary и Employee#salary. Код в Employee видит одно поле а код написанный в Manager другое (впрочем в manager кода нету).
var_dump кстати покажет что поле salary встречается 2 раза в объекте.
> const NAME = 'manager'; Еще мне не нравится переопределение константы в наследнике. По моему ощущению, это не очень правильно так как одна константа принимает разные значения в разных классах — как так? Плюс, у тебя нет способа заставить потомка определить константу.
Правильнее сделать в Employee абстрактный метод getName если надо получать профессию работника.
>>452196 А. Понял что неправильно сделал. Уже исправил.
>>452197 >Еще мне не нравится переопределение константы в наследнике. У меня ошибка выдается о том что неизвестная константа, если её не определить в потомке.
>Плюс, у тебя нет способа заставить потомка определить константу. > >Правильнее сделать в Employee абстрактный метод getName если надо получать профессию работника. А она разве не наследуется? Есть же метод: https://github.com/someApprentice/Vector-Com/blob/master/Classes/Employee.php#L37 Или все эти методы в данном случае должны быть абстрактными? Если да, то можно ли конструктор сделать абстрактным?
>Еще мне не нравится переопределение константы в наследнике. Ты мне советовал сделать >>451707 >Название надо сделать константой вроде Employee::JOB_ENGINEER.
Наверно, я тебя не правильно понял. Эти константы все константы названия сотрудников нужно было задать в Employee?
> Эти константы все константы названия сотрудников нужно было задать в Employee? Было бы неплохо но в правильном ООП предок ничего не знает про своих потомков так что нет.
>>452122 >Лучше делать роутинг на стороне php и не беспокоиться по поводу сервера. Да я согласен с любым вариантом, честно говоря, лишь бы работало. Сюда я зашел попросить объяснить, как это делается, или же получить мануал по этому.
>>452126 >Яндекс не приукрашает адрес страницы поиска >не надо переделывать URL которые генерирует форма поиска Но яндекс тоже меняет URL при поиске, например https://slovari.yandex.ru/%D0%BC%D0%B0%D0%BC%D0%BA%D0%B0/en/ Да, это словари, а не веб-поиск, но и у меня проект словаря.
А вообще, я не против самого поиска с URL вида "test.com/?search=слово" (у меня сейчас там выводится список найденых слов). Но вот потом я хочу, кликнув на слово, попасть на отдельную страницу с урлом "test.com/слово". Как этого добиться?
Аноны, объясните аутисту про MVC, ООП. Нихуя не понимаю че за модель, че за вью, че за контроллер. Представление о том, что модель это типа модули сайта, вью шаблоны там дизайны, а контроллер это все объединяет есть, но я все равно сосу хуй.
У меня вопрос про вторую задачу о векторе. Мне лучше каждую должность обозначить своим собственным классом? Типа сначала создать класс Employee, а после этого унаследовать от него еще 4 класса, в виде менеджера, маркетолога и тп? И нужен ли класс департамент? Мне кажется что да, буду сразу создавать объект напичканый этими менеджерами и инженерами? Всё правильно думаю?
>>452246 Суть в том что есть метод для вывода всего что есть в базе данных, и собственно первые три свойства это поля базы данных, поэтому передавать их как я понял не надо в этом случае. Как же правильно написать объект в этом случае?
>>452120 >Сделай чтобы можно было добавить любое число блоков, прижатых к верху или низу. если обозначить их через класс, тогда между блоками будет разное расстояние, из-за того что это блочно-строчные типы.
>>452308 Я не понял этого вопроса? Типа как мне видится, так и надо делать? >>452309 ну тогда в свойствах работника сделать пункт с указанием на то, к какому департаменту он принадлежит? Красивее имхо и логичнее завести таки класс департаментов.
>>452312 >Типа как мне видится, так и надо делать? Да
>Красивее имхо и логичнее завести таки класс департаментов. Определись с функционалом. Вообще, проще будет все в БД забить и с ней уже работать, связывая таблицы между собой. А так да, можно и так как ты это хотел сделать.
>>452318 >почему там эхается весь твой скрипт в ответах? Если тебе еще интересно. Программа эхалась из за <? вначале вместо <?php. Посто настройки php разные у у меня и у ideone, но вообще, признаком хорошего тона является <?php
>>452328 Всё, вроде работает. Но все равно чет я не въезжаю пока в этот код. особенно в конструкцию с $ivan->getWork()->getName(); Я еще понял бы что значит $ivan->getWork(); или $ivan->getName();
>>452331 я вот этого тоже пока понять не могу. Ладно у тебя есть объект, да? Ты пишешь $обьект->метод(); тип верно? Ну допустим сохранили в переменную результаты: $переменная = $объект->метод(); Ок, но потом какого хрена к тому что у нас в переменно какие-то методы применимы? Там же не объект лежит? Почему можно писать так?
Оп! Ты вообще классный пацан, я тебе уважаю, ты вообще всё так по существу говоришь и вообще чётко объясняешь. По качеству всё так делаешь. У меня к тебе вопрос, я вот с нуля начал учиться опираясь на составленный твоим педагогическим гением мудрый учебник, вооот. И как об стенку горох бьюсь уже второй день над заданием, ты сказал изменить цикл, я вот его изменяю и у меня ошибка по ходу дела выпала. В одиннадцатой строчке ему не нравится точка с запятой и "echo" кажется. ps сильно не бей. <?php
Если заменить echo на print () то все заработает. В for можно вписать любую команду, не только $i = 0. Хотя в реальных программах конечно такие трюки делать не стоит.
>>449425 ОП, доброго времени суток. Из всех тредов, твой мне показался наиболее дружелюбным и привлекательным. Чуть расскажу о себе вводные данные. Мне 22 года, ненужная вышка гуманитарий, мамка приказала, работа, не требующая особых умственных усилий. Недавно я заглянул внутрь себя и честно сказал: "Мне это все нахуй не нужно." Вспомнил детскую мечту, когда еще впервые познакомился с компьютером - стать программистом. Мне всегда нравилось возиться с пекарнями, цифровой и вычислительной техникой. Кажется, такие как я называются свитчерами - те, кто работает пока еще на своей текущей работой, но в свободное время полностью занимаются самообучением, чтобы перекатиться в другую область. Пока достаточно, собственно, что я у тебя хотел спросить: какой набор знаний необходим джуну для того, чтобы получить работу в ДС, ДС2? Я упарывался ХТМЛ, КСС, но тонуть в простой верстке я не хочу, хочу шевелить мозгами и писать код. Вот только я теперь запутался, нужно ли пхп разработчику отлично знать хтмл, ксс и чем вообще занимается этот ПХП разработчик? Сколько времени мне может потребоваться для того, чтобы понять синтаксис, изучить ООП, склепать для опыта пару простых проектов? Сумбурно, но как смог. Жду ответа, ОПчик.
>>452410 >какой набор знаний необходим джуну для того, чтобы получить работу в ДС, ДС2? http://archive-ipq-co.narod.ru/ >Сколько времени мне может потребоваться Индивидуально же, а так около полгода в среднем. Не ОП, раз уж это стало важно на анонимных бордах.
Спасибо всем великим мыслителям и Опу, что снизошли до меня и указали на праведный путь. Раз вы такие милые, то буду иногда захаживать И задавать тупые вопросы. http://ideone.com/cbG3D1
ОП, привет. Я начал учить похапэ по книге Энди Харриса "PHP MySQL для начинающих". Он мне предложил скачать PHPTriad, потому что в его примерах нужен будет Апач, мусекуэль и интерпретатор. Я в душе не ебу как всю эту хуйню настраивать, но если я все это освою, то могу хуярить на работку?
Привет, ОП. Я не программист, но немного кодить на php умею. Сейчас занимаюсь латинизацией русского языка (хобби). Хочу написать программу для автоматического перевода текстов. Вопрос, как сделать, чтобы "я" в начале слова и отдельно переводилось как ja, а в остальных случаях как ä?
>>452229 >объясните аутисту про MVC, ООП Это непростая задача, тем более в интернетах уже все есть (хабростатьи поищи, например). Читай больше материалов, перечитывай. Сначала по ООП потом MVC.
Перепост, случайно запостил в прошлый тред. Котоны, нид хелп. Вот и еще одно собеседование, которое я провел весьма достойно(не омежничал, ответил уверенно и хорошо на все вопросы, сделал практическую часть, ответил на теоретическую часть). АшЭр кивал и улыбался, Прогер сказал, что я малаца и все верно ответил\решил и вот мне сказали, что решение будет в среду максимум. Сегодня четверг, а это значит что меня в очередной раз пидорнули с вакансией. Ходить дальше думаю смысла нет, это не первый раз, а денег нет. Так вот думаю начать фрилансить помалой, но как начать? Посмотрел на одеск там какой-то пиздец, какие-то поиски в свою команду, какие-то тесты на fluent english по скайпу, какие-то требования, быть индусом\филипинцем. Как найти себе работу\подработку на пыхе? Кто фрилансит поясните нубу попонятней, плз.
>>452455 На хабре видел статью, что нормальные прогеры не нужны, так как могу уйти. Не думаю, что это про тебя, но может тебе попробовать в достойную фирму пойти, рас ты такой охуенный?
>>452460 Я, когда меня в крупной фирме задинамили, так и сделал, в ответ получил какие-то ашерские сопли о том, что подобную информацию фирма не дает, и она лично не имеет права разглашать свое мнение. Интересно, что после собеседования, которое длилось в течении 2-х недель(несколько уровней тестов, тестовое задание и наконец собеседование с ашером и техническим хуйцом-спецом) я был уверен, что мои шансы больше 90%, потому как за собой ни единой промашки не нашел. А потом такой облом. Реально я как-то уже устал от стольких обломов за столь коротикий промежуток времени. А теперь еще и днищефирма меня бортанула, это уже и вовсе дно. Хочется накидаться чем-нибудь и побыть в коматозе неделю другую пока не отпустит.
Сосаны, у меня не выходит нормально работать с url после гет-запроса. Поясню свою проблему: у меня html-шаблон отделен от php кода; в шаблоне есть две ссылки <a> с текстом "Русский" и "Английский", нажимая на которые я хочу менять значение переменной, которая в свою очередь будет подставлена в href этих ссылок. Например, мой url выглядит так - блабла.рф/?q=&lang=ru. Тыкнув по ссылке "Английский" я хочу сменить переменную lang на "en", и перейти уже по этому новому url. Как это сделать? В самом php файле я могу сформировать запрос ($data = array('q' => $searchField, 'lang' => $lang); $link = "?" . http_build_query($data);), но я не понимаю, как это подставить в шаблон.
>>452467 У тебя два пути - регулярные выражения, или же самому написать небольшую функцию распознавания места в тексте. В первом варианте тебе поможет гугл, а во втором логика простая - проверяешь символы вокруг твоего "я", и если там с обеих сторон пробел или пунктуация, то это отдельное слово "я".
>>452471 Смотри как работают шаблонизаторы. Сделай функцию которая будет принимать массив данных для шаблона и его название, а на выходе валидный htmlвнутри просто заменяй {{имя_переменной}} на значение этой переменной из переданного массива. А вообще, просто используй уже готовые шаблонизаторы.
>>452469 1)Днофирма ашер: пара вопросов, кто такой , почему ИТ, какой опыт. тех-хуец: все по книжке шевченко, я серьезно. 2)Крутая фирма ашер: типичные ебанутые ашерские вопросы, симтуационные вопросы, о будущем. о прошлом, о коллегах, ла-ла-ла, прочий несуразный бред за который хочется просто послать всех их с фирмой нахуй, но я держался достойно, отвечал лаконично. красиво и вдумчиво. пояснял свою мысль. дополнял аргументами. Спец-хуец: пыха, сикуел, жиквери, жиэс, все до мелочей, какие-то практические задачки на пыху(фуфло а не задачки), на сикуел запросы(посложнее), на жиквери(среднячок и крутые). В общем, подозрение, что на крутой меня ашер бортанула, может потому что я слишком уверенно себя вел(шутил, но уместно, пипл смеялся, чувствовал себя раскованно, отвечал смело и широко). Х3. Но на днофирме почему - не знаю.
>>452475 С нуля, опыт небольшой есть, хочу устроиться в фирму, чтобы стать оче-уверенным разрабом. Хотя бы пару лет побатрачить, потом может и на фриланс, хотя вряд ли - я слишком ленив, боюсь самоконтроля не хватит.
>>452476 >может потому что я слишком уверенно себя вел(шутил, но уместно, пипл смеялся, чувствовал себя раскованно, отвечал смело и широко) this, но это лишь мое мнение. Больше нет никаких вариантов, раз ты все ответил. Даже странно что бортанули. Но, может много денег просил?
>>452480 >денег много просил Нет, посмотрел статистику за текущий год и взял чуть меньше среднего. Пояснил, что готов поработать за меньшую сумму чем оклад на испытательном сроке.
>>452474 Я прочитал обе статьи (оповскую и ту, на которую оповская ссылается), но с их помощью у меня не выходит решить свою проблему. Если бы мог самостоятельно, то не писал бы сюда... А использование сторонних шаблонизаторов мне кажется не очень правильным в страничке на 10 строк.
Может кто-то поможет написать правильно эту строку в шаблоне <?= '<a href="/?' . htmlspecialchars($link, ENT_QUOTES) . '"></a>' ?>, чтобы она еще и переменную $lang как-то могла изменять?
>>452481 >Пояснил, что готов поработать за меньшую сумму чем оклад на испытательном сроке. Вот так пришел и пояснил? Мне казалось, что наоборот, надо пояснять что бы работать на испытательном строке за полный оклад. Ты просто шокировал их своей уверенностью.
>>452484 До обучения хтмл и ксс, потом начал здесь читать тред, кажется с 13-го, потом начал практиковаться сам - гиты-хуиты, линуксы-хуинуксы, вп-хп, мвц-хуимц и прочая.
>>452483 Но, не сидеть же омежным чуханом. Они ищут сотрудника - я говорю, вот Я сотрудник, я БУДУ работать, я СМОГУ\СДЕЛАЮ. или обычно ищут: ну-хуего-никогда-не-работал-може-получится
>>452482 1. Размещай шаблон в имя_шаблона.tpl. 2. Пиши напиши свой шаблонизатор. 3. Используй его.
<a href="/?lang={{lang}}">{{lang}}</a>
Вот так будет выглядеть твой шаблон. С помощью регулярки ищи все {{набор символов}} совпадения и в цикле обрабатывай их, заменяя на необходимые тебе значения.
>>452489 Нет, просто, чтобы быть в теме, знать как устроено и сверстать. что-либо, если потребуется, хотя, если честно мне не очень нравится верстка - нудно. Я для себя бутстрап открыл и подсел.
>>452487 Вряд ли мы сейчас придем к какому либо выводу, так как не знаем в чем проблема.
Пробуй еще, ходи на собеседования. Но главное - узнай как то в чем проблема. На собеседовании обычно не тычут лицом в ошибки, а лишь кивают. Может ты ошибся просто?
>>452491 Но, я ведь придя домой первым делом полез курить маны по тем вопросам, где я не был уверен на 100% и оказалось, что был прав. Да и вряд ли тебе скажут - ВСЕ ВЕРНО, МАЛАЦА, если ты ошибся или я чего-то не понимаю в современном мире.
>>452493 Долго, месяцев 4-5, потому как вечером после работы и не каждый день. Так-то теперь я согласен, что его можно на ять за месяц осилить не напрягаясь.
>>452488 Это слишком сложно. Я хотел сделать это обычными методами, теми, которые советует ОП. По его словам, писать свой шаблонизатор не нужно, и я с ним согласен - на тестовой страничке этого делать явно не стоит. Должен же быть способ сделать это проще.
>>452502 Хорошо, но ответь пожалуйста на последний вопрос: без использования стороннего шаблонизатора или же написания своего, используя способы ОПа сделать ссылку, которая записывает данные в переменную, невозможно?
>>452517 Он ссылку кинул. >>452516 Лол, я тебе говорю дай ссылку на ideone где у тебя ошибка и где ты делал как велит тебе Гениальный Оп и где у тебя не получается.
>>452508 Ну вот тебе пример того, что советует ОП (и другие тоже, ага): <html> <p>Привет, <?=$this->e($this->name)?>! Тебе <?=$this->e($this->age)?> лет.</p> </html>
>>452531 А я и не говорил, что это шаблонизатор. Я говорил, что у меня html-"шаблон" отделен от основного кода. Правда теперь я не знаю, как работать с url в таком случае.
>>451697 http://rghost.ru/7VzdkM8Tw переделал. Извиняюсь за ргхост, с гитхабом еще не разбирался. >У тебя на кнопке See portfolio активна только надпись, а кликать по краям бесполезно Вот это я не смог сделать. С кнопками соц-сетей получилось, а с этой нет, я когда делаю height 100% на ссылку, она становится больше родителя почему-то. Я уже и inline-block на родителя ставил, и в пикселях значение подбирал - не помогло. Еще я не пойму, почему когда я задаю, допустим, margin-top для одного строчно-блочного элемента, то вниз сдвигается и соседний с ним?
Это снова я на связи. Сыграйте в мою веселую рулетку, я старался: http://ideone.com/z1hrJV Если учесть, что пользовался только тем материалом, который дал ОП в своем учебнике - норм? Как можно сократить этот код?
>>452536 Хм, странно, там теперь вместо монитора второй андроид, хотя до этого все работало. Внезапно ксс стал кейс-сенсетив и стиль не применился, потому-что я обращался к нему с маленькой буквы. Вот исправленная версия http://rghost.ru/6zhRD4mCj
>>452539 Хоспаде, первый день штолесука. Вообще, лично я поклонник switch для подобных целей, как-то наглядней смотрится + ты бы хоть кнопку пуска запили и какой-то сопроводительный заголовок, а то вообще днищерулетка получилась.
>>452533 https://gist.github.com/anonymous/a66242a8ceba1a764d79 Вот два файла. Сейчас ссылки работают и даже создают правильный url. Но! Мне нужно, чтобы не просто url писался строкой, а туда подставлялась переменная $lang, которая задавалась в зависимости от ссылки, которую выбираешь. Кликнул на "Русский" - переменная $lang стала "ru" и ушла в url, кликнул на "Английский" - переменная стала "en" и ушла в url. И также у меня почему-то в форме не срабатывает подставление $lang.
Может просто пришел кандидат который был лучше по соотношению цена/знания? Или например они хотели человека с опытом и боятся брать без опыта? тут может быть 100500 причин.
Ну и может быть даже какой-то дикий вариант что они хотят поменять своих сотруников на таких же, но более низкооплачиваемых, пользуясь ситуацией на рынке, кто их знает.
Насчет фриланса, есть еще такая вещь как постоянная удаленная работа, выгода в том что не надо тратить время на поиск заказчиков, переговоры.
> >У тебя на кнопке See portfolio активна только надпись, а кликать по краям бесполезно > Вот это я не смог сделать А ты решал предыдущие задания? Если нет то надо их сначала решить чтобы разобраться с особенностями разных элементов и свойств. Те кто пропускают первые уроки и берутся сразу за сложные, разумеется путаются.
Ссылка по умолчанию инлайн элемент и для них нельзя задать ни высоту, ни ширину.
> я когда делаю height 100% на ссылку, она становится больше родителя Может у тебя паддинг там есть. Ты блочную модель изучал? height это внутренняя высота элемента или наружная?
> Еще я не пойму, почему когда я задаю, допустим, margin-top для одного строчно-блочного элемента, то вниз сдвигается и соседний с ним? Можешь на jsfiddle сделать пример? Так, виновато может быть вертикальное выравнивание или еще что-то.
>>452552 Я все задания выполнял так-то по порядку. Ссылку сделал блочным элементом, дело не в этом. >Можешь на jsfiddle сделать пример? Я делал маржин для надписи ebpaint Но сдвигался и логотип, хотя я его вытащил в отдельный див. >Имена классов и id по моему чувствительны к регистру. Фиг знает, я пока доктайп не написал (хотя может это произошло еще раньше), у меня все нормально было, а потом внезапно обнаружил, что у меня второй андроид вместо монитора.
> Мне нужно, чтобы не просто url писался строкой, а туда подставлялась переменная $lang, которая задавалась в зависимости от ссылки, которую выбираешь У тебя в самом начале написано $lang = 'ru'; Это значит что в этой переменной будет строка 'ru'.
> без использования стороннего шаблонизатора или же написания своего, используя способы ОПа сделать ссылку, которая записывает данные в переменную, невозможно?
Шаблонизатор вообще не при чем. Ты понимаешь, как работает «ссылка»? PHP перед запуском твоего скрипта разбирает строку запроса query string (то что идет после знака вопроса) и заносит значения в $_GET. Например ты набрал в адресной строке
index.php?a=1&b=2&c=3
В этом случае PHP поместит в массив $_GET 3 элемента:
'a' => 1, 'b' => 2, 'c' => 3
Ты можешь это легко увидеть если поставишь в начале своей программы var_dump($_GET) и откроешь эту ссылку.
Аналогично при отправке POST-формы PHP извлекает переданные значения из тела запроса (тело запроса составляет и отперавляет браузер когда ты жмешь кнопку Отправить) и помещает найденные значения в $_POST.
Также я советую прочесть, если ты еще не читал, эти страницы мануала:
Прочти их, если не читал, посмотри что выводит var_dump и если что-то не заработает или будет непонятно, задавай вопрос, мы постараемся ответить.
> И также у меня почему-то в форме не срабатывает подставление $lang. А ты ее туда поставляешь? Я не вижу в форме поля с именем lang, я вижу только поле text. Следовательно при отправке формы на сервер будет передано только значение text.
Ну и еще вопрос, а у тебя включено отображение ошибок? Так как если просто открыть index.php то должны выводиться ошибки. Если ты их не видишь то надо их включить.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
> я пока доктайп не написал (хотя может это произошло еще раньше), у меня все нормально было, а потом внезапно обнаружил, что у меня второй андроид вместо монитора. Если нет доктайпа то браузеры могут отступать от стандартов. Лучше всего ставить его первым делом и не мучаться. И проверять свой код валидатором (есть расширения к браузерам которые могут отправлять текущую страницу на проверку в 2 клика).
> Я делал маржин для надписи ebpaint Но сдвигался и логотип, хотя я его вытащил в отдельный див. Трудно сказать в чем дело. Если бы ты мог сделать упрощенный пример (только эту часть страницы) на jsfiddle или codepen, я бы мог посмотреть.
> Ссылку сделал блочным элементом, дело не в этом. Дело не в паддинге? Также, ты учел что height в процентах работает только если у родителя высота тоже задана в пикселях или процентах?
Ищу анонов для совместной разработки чего-нибудь интересного и нескучного АИБ/очередной микрофреймворк. Все равно на чем пишешь. Предпочтителен PHP, раз решил запостить это здесь, но можем попробовать хоть какой-нибудь Hack. Ну или же написать и оформить интересный Руби-гем.
Telegram: http://goo.gl/foJd40Могу оставить и скайп, но кому он нужен в 2015 году?
По моему в верстке есть интересные вещи. Например то, что ты можешь с ее помощью делать страницы, которые тянутся в ширину и не ломаются от смены размера шрифта. Ну и с возможностями CSS3 можно делать всякие интересные вещи. Вот например что можно сделать одним дивом: http://habrahabr.ru/company/paysto/blog/251933/
Не исключаю конечно что не всем это нравится. Но мне изучать особенности CSS в свое время было интересно.
> С помощью регулярки ищи все {{набор символов}} совпадения и в цикле обрабатывай их,
А ифы и циклы? А вызовы методов? Я сталкивался в одной платной CMS с таким шаблонизатором, и очень хотелось побить автора что изобрел кривой неудобный велосипед вместо использования нативного php или того же twig. Шаблонизатор был настолько плохой что многие вещи пришлось делать яваскриптом, например переводя даты в нужный формат уже после загрузки страницы вместо того чтобы сразу вывести их как нужно.
>>452559 Спасибо, ОПушка. С вардампом до меня дошло, что происходит и половина вопроса решилась - в коде я просто делаю вот это $lang = $_GET['lang'], а на страничке в каждой ссылке вот это href="/?q=' . htmlspecialchars($searchField, ENT_QUOTES) . '&lang=en" и у меня все срабатывает! И переменная записана, и ссылка теперь правильная.
Остался второй вопрос - про использование языка во время отправки формы. >А ты ее туда поставляешь? Я не вижу в форме поля с именем lang, я вижу только поле text. Следовательно при отправке формы на сервер будет передано только значение text. Получается, что нужно создать скрытое поле, если я не хочу еще один input с выбором языка?
Debian хорошая ОС, но меня напрягает что софт там очень стабильный, то есть старый. PHP старый, lxc старый глючный, emscripten без плясок не установишь.
>>452590 Спасибо, теперь все встало на свои места. Кстати, я там еще один косяк заметил у себя, так что вот финальный вариант http://rghost.ru/6gb8tVWKC
>>452590 Спасибо, няшка, все получилось с этими полями lang. Теперь все красиво переключается и форма отправляет из скрытого поля необходимое значение.
Опять нуб на связи. Подскажите, как этот говнокод можно привести в нормальный вид? Натыкал костылей, работает, но вижу, что хуета полная в коде. Таких как я, наверное, называют говнокодер и пхп макака.
>>452741 Смотри ошибки, там внизу они написаны. У тебя типичная ошибка для все начинающих работать с массивами.
PHP Notice: Undefined offset: 7 in /home/PbiVDX/prog.php on line 16 PHP Notice: Undefined offset: 7 in /home/PbiVDX/prog.php on line 19 PHP Notice: Undefined offset: 9 in /home/PbiVDX/prog.php on line 20
Индексы 7 и 9 в массивах не существуют. Потому-что count(Массив) Возвращает колличество элементов в массиве, но не последний его индекс. Вот у нас допустим массив из трех элементов. Какой будет его последний индекс? 3? Нет, 2, потому-что отсчет начинается с нуля. Поэтому от count надо еще и отнимать 1. Смотри на ошибки внизу, это тебе поможет в будущем видеть в чем проблема и на какой конкретно строке.
>>452742 http://ideone.com/pb66Ge Вот так чели? Но ведь все равно это галимый говнокод у меня получился, ведь как-то рациональнее все можно сделать. Я правильно делаю, что начинаю отсчет с нулевого элемента в mt_rand?
>>452743 Можешь все свои массивы слов загнать в один многомерный массив и написать функцию, которая будет проходить по вложенным массивам и извлекать необходимое количество слов в нужный момент и ставить в нужное место. Вот тебе будет уже не говнокод, а интересное решение, заодно с функциями\циклами познакомишься. мимо-хуй-полгода-стаж-пыхи
Спасайте ироды, copy ошалел. Нихуя не может копировать с www/data/images/1.jpg в www/data/images/2.jpg, правда везде 755. При этом спокойно копирует с www/data/images/3.jpg например. и 1.jpg и 3.jpg файлы существуют. Таким образом в совершенно одинаковых случаях это говно ведет себя по разному.
Выручайте, нуб снова здесь. http://ideone.com/1aak06 Помогите мне присвоить значение $symbol1 и $symbol2 таким образом, чтобы символ1 сначала брал 1 символ в строке, а символ 2 брал последний символ в строке. Изломал свою чекалдушку, не хочу от такой формы записи уходить.
>>452761 >$symbol2 = mb_substr($text2, $i, -1); Там нужно -$i, а не минус 1. Последняя цифра это сколько символов ты хочешь взять из строки, там не нужен минус. А там где переменная, это с какой позиции ты хочешь взять букву. Если она будет отрицательная, то буквы будут браться с конца.
>>452764 Не совпадают, потому-что на первом шаге минус ничего не делает (не может быть -0) >>452765 Это же обычная арифметика. Если отстает на 1, значит нужно прибавить один.
>>452763 Бля, я понял, что он возвращает сначала 1 элемент, потом последний, а они одинаковые. Как сделать так, чтобы он сразу вернул именно последний элемент. Выражение -1+$i - Хуета, не сработает
не могу понять как его дальше разбирать? как получить количество фото в альбоме(его нам сам вк считает) и как вывести ссылки пакетами(там одно фото в разных размерах)
>>452790 нее... это я умею. я не могу вывести количество. и не могу вывести ссылки группами типа: фото1 : перевивью малая большая очень большая огромная.
>>452823 Ох, лол. Ты напомнил как я сам начинал и охеревал с этой задачи, а еще от моего разленившегося мозга, который не мог тукаю хуиту простую сделать с наскока. Чем помощь? Сначала набросай схему работы(что за чем, и когда, и если) программы, а потом лишь начинай описывать ее реализацию. Поверь, так сразу напишешь.
>>452884 Извини, но тебе не стоит этого делать. Сам не сделаешь - не научишься. Реши задачу математически. Потом рисуй схему, где в манере развилок(гипертестов\вилок или как это назвать) выводи действия - типа : сделал действие1->сделал2-> повторил действие1 else действие2->действие1->действие3. Ну ты понел. В общем, не сдавайся, соберись, подумай, сделай перерыв на какое-нибудь развлечение и продолжай. Нельзя на начальном этапе пользовать готовыми решениями, это пагубно сказывается на усвоении информации. Главное алгоритм(скелет проги), потом уже реализация. Если есть алгоритм - написать вопрос вообще не стоит, ты ведь уже знаешь, что ты хочешь получить и когда. Добра.
>>452896 Спасибо за совет. Ебучий нуб опять на связи. http://ideone.com/QRAk3Q Мучал-мучал код, взгляните, ткните еблом меня, что не так делаю? В правильном направлении иду хотя бы?
Познакомился наконец-то с PDO до этого использовал mysqli, что то мне показалось что mysqli удобнее, особенно напрягают некоторые проблемы с использованием имени полей таблицы в запросе, с запросами вроде INSERT, UPDATE и другим, но как я понимаю надо использовать PDO, поясните, я ошибаюсь PDO на самом деле удобнее и я просто не всё понял? Мне как-то показалось что писать что то такое:
Еще одно затруднение постигло нуба. Установил я денвер, протестил: на локалхосте страницы хтмл открываются. Но когда я попытался по книге написать код, то не получил результат, который описывался в книге, пикрелейтед. Подскажите, что я не так сделал?
И еще, раз тут такая пляска по книгам пошла, вот эта книжка подойдет для изучения? Понимаю, что по году она от современности отстает, но я в агнлийский пока плохо могу, чтобы читать в оригинале.
>>452955 Устаревший подход к написанию кода. ООП вообще нету, все чисто на процедурках. Многие вещи придется переучивать. Я сам с этой книжки начинал, не сказал бы, что зря потратил время, полезным вещам тоже научился, но учебник ОПа + официальная документация реально будет полезнее.
И там написано что нельзя проверять на простые типы как: int, bool и так далее. А я как раз делаю конструктор сотрудника и хочу что бы туда сразу передавался его ранг в виде int и то, начальник он нет, в виде bool.
А еще вот такой затуп. Например у меня будет человек повышаться в ранге. Соответственно нужно делать 2 переменных под зарплату? Что бы в первой хранить зарплату по умолчанию для всех, а во второй хранить зарплату текущую, в зависимости от ранга?
>>452990 Спасибо, пока отложу это. Нужно судя по этим функциям делать доп проверку внутри моей функции с их участием, а я хотел супер элегантно в духе: function count(array $array) { return count($array); }
Алсо ты можешь помочь по задаче с вектором? У меня куча вопросов, а если я буду ОП-а ждать, то не буду код писать.
В общем как я понимаю родитель не знает о данных своих наследников? Могу я составить конструктор в родительском классе, и использовать в нем данные наследников?
И вот еще вопрос: Если у сотружников в зависимости от ранга или лидерства меняются параметры, то мне в конструкторе это дело по хардкору настраивать лучше? Или просто потом сделать функции которые будут это дело сразу высчитывать в процессе?
>>453000 Спасибо, вроде бы работает: http://ideone.com/jKnvgR Оказывается просто тогда не должно быть в родительском классе таких же полей как в наследниках, тогда конструктор лезет сразу в поля наследника.
Оп, не думаешь добавить в учебник что-нибудь про mvc, я вот так-то в общих чертах себе представлял что к чему, ну там все эти рисуночки с моделью-котроллером-вьюхой, отделение логики от штмл, звучало многообещающе. Начал углубляться и просто выпал в осадок. Такая дичь пошла... настраиваем .хтассесс, во всех примерах по-разному, при разных структурах папок все по-разному, 'тут мозги не парьте, копируйте и все', разбиваем урл, первый кусок будет классом, второй кусок будет методом, остальные куски будут параметрами. Крутые истории ваще, я к этому был не готов. И главное где в итоге отделение штмл я не увидел, так как эти вьюхи по сути классы с методами типа function output() {echo "<div></div>"}. Ну или посоветуй норм источник почитать.
нужно простое веб-приложение которое будет формировать конфиг файл на основе настроек, задаваемых юзером через этот самый интерфейс. также не помешал бы какой-то встроенный механизм авторизации. в общем, что-то вроде интерфейса настройки роутеров авторизацию, думаю, сделаю через веб сервер, а вот по всему остальному куда копать?
>>452962 За эти не знаю, но рекомендую на русракере поискать видеокурсы Специалист. они там были еще недавно, 20 гектар или коло того, но тебя интересует пыха, там 4 курса лекций бауманки, где для нубаса самый смак - вдумчиво и пережевывая подается док с пхп,нет. Есть лабы, я их делал по ходу, рекомендую делать. Сначал про процедурку и кодинг в целом, потом и к ооп подводят и идут по ооп. Я считаю что для нубаса очень годные курсы несмотря на дату выпуска. алсо, пока писал уже и загуглил - вот новый курс http://rutracker.org/forum/viewtopic.php?t=4620353 за 2013, не знаю не смотрел, ща качну гляну что там. А вот старый походу потерли, не могу найти.
>>452998 Ага, ты хоть пыхапэнет почитай чтоле. Это называется наследование, вызываешь через парент:: конструктор родителя, потом дописываешь хуиту наследника, ололо все работает. Ну, серьезно, начинай читать мануал, он годный, базарю.
>>453014 Спасибо, качну-гляну. Но, имхо, в курсах от Специалиста оче много воды, слишком уж сильно разжёвывают. Был опыт, когда хтмл/цсс ковырял. На 4-м уроке моё терпение лопнуло и я скачал интенсив от хтмлакадеми.
Несколько вопросов к шарящим анонам: Нормально знаю ООП, могу писать в этом стиле, понимаю принцип mvc (но особо не работал с ним), естественно все дифолтные задачи на выборки/добавление етс могу сделать на php+mysql, помимо этого знаю более менее js и jquery. Но блять, заходя на фриланс сайты и пытаясь что-то там найти, я нахожу кучу проектов по доработке сайтов на джумле/вордпрессе (второе преобладает) + написание плагинов для них, и тут я в ступоре. 1) Как научиться делать эту парашу, что почитать? И насколько много потребуется времени, учитывая что знаю описанное выше? 2) Что больше всего я не могу понять -- допустим у чувака интернет магазин на какой-то cms-ке, у него там в корзине какие-то поля есть, он просит добавить, например, выбор цвета для товара/добавить новые поля/еще какая-то параша которая, как я понимаю, связана с работой с бд. Но как это сделать? Лезть в скрипт той же корзины, искать где там добавление товара в базу, предварительно добавлять в базу еще одно поле (если чуваку цвет нужен например), и добавлять? Это какой-то неебически-мазахисткий способ, можно сдохнуть. Анон, надеюсь я ошибаюсь и есть другие способы? Поясни, пожалуйста. В целом вообще не понимаю, как работать с БД и вносить поправки в скрипты в этих ебаных CMS.
Алсо, если есть какой-то путь, что почитать/посмотреть, чтобы по итогам не задавать вопросы на дваче а уже самому ответить на вопросы выше -- подскажи, добрый анон. Заранее спасибо<3
>>453087 Так у тебя опыт работы реальной есть в какой-нибудь самой задрипанной конторе хотя бы? Имхо простейший способ начать зарабатывать на фрилансе - это устроиться куда-то джуном или хоть кем, поработать несколько месяцев, что бы руку набить, и после этого уже смотреть, можешь ли ты этим фрилансить. В любой конторе будет КАКОЙ-ТО КОНКРЕТНЫЙ СТЕК ТЕХНОЛОГИЙ если это натягиватели дизайна а джумлу или друпал, то ты прокачаешься там в этом, если ебашители на yii, simfony... ets, то в том. И далее ты просто ищешь на этом самом фрилансе, то что ты УЖЕ УМЕЕШЬ ну плюс минус какая-нибудь хуйня, которую можно в процессе освоить. В общем это лишь имхо теоретика, но так как сейчас у нас глубокая ночь и нас тут всего двое, то почему бы и не ответить.
От копипасты постарался избавиться в зародыше: сначала у меня были одинаковые функции для подсчета кофе, зарплаты и документов для депертаментов и фирмы в целом - переделал в одну с пареметром. Надеюсь я правильно понял суть.
Нуб опять в треде. Сегодня на свежую голову сел писать задание, решил не смотреть, что у ОПа в учебнике на скриншоте, абстрагировался и написал вот эту хуету:
Это все тот же нуб на связи. Я придумал, над каким проектом я буду работать пока буду изучать PHP. Я упарываюсь велосипедами и решил разработать сайт этой тематики: информация о всех велосипедах - новинках, моделях прошлого, информацией об аксессуарах и т.д. Прикинул стек, который мне для этого нужен: html, css, макет простенький набросать, php, JS, MySQL. Когда мне удастся с нуля запустить этот проект на хостинге, могу ли я расчитывать на получение работы джуном в ДС2 например?
Установил Yii2 через компосер из Open server'a встало без ошибок всё. Но теперь вопрос: в инструкции на гите написано, что после установки будет работать ссылка: http://localhost/basic/web/index.php, но, у меня папка basic не в domains/localhost, а в корне open servera, соответственно по такому адресу она не запускается. Что делать то? Не вручную же переносить в localhost?
>>453211 Так ты не решал предыдущую задачу про кредит? Зачем же перепрыгивать на более сложные задачи, не решив перед этим задачу попроще? if($totalCredit < $monthPay){ break; } Бессмысленная конструкция. Если оставшийся кредит меньше ежемесячной выплаты мы просто прекращаем платить? Банк простит нам оставшийся долг? Что за переменная $total? Она вообще нигде не используется.
>>453209 Попробовал снова установить изменив папку: composer create-project --prefer-dist yiisoft/yii2-app-basic domains\localhost но выдает ошибку: [InvalidArgumentException] Project directory domains/localhost/ is not empty. В интернете не хватает нормального гайда по установке yii на опенсервер.
>>453217 Она не правильно решена, так что можно сказать, что ты её не решил. Ты выкладывал её в тред? ОП бы тебе сказал, что тут решение не верное. У тебя должно получиться в конце 61 тысяча с чем-то.
>>453213 а про остаток и платеж: я так понимаю, если цикл придет к значению $totalCredit < $monthPay, то анону нужно будет заплатить меньше 5к, именно поэтому я ввел эту строку. В первой задаче все работало, внимание рассеялось, не могу понять, в чем дело.
>>453220 Так код внутри функции в этой задаче ничем и не должен отличаться от кода в предыдущей задаче, можно тупо скопировать его внутрь функции. А у тебя вообще что-то не то, в первой задаче у тебя совсем другое тело в условии, а тут ты просто break написал и думаешь, что каким-то чудесным образом остаток сам себя выплатит. >>453222 Тут каждую неделю по несколько анонов эту задачу выкладывает и у всех получается 59к, а нужно 61, я уже скоро наизусть выучу. Если ты не веришь мне, дождись ОПа.
>>453224 Прости, напиздел на тебя. Воткнул ща в код про айпад код из айфона - все заработало. Понимаю, что он не эффективный. Ща отредактирую, скину сюда.
ОП, два дня я мучил себе голову с этой задачей, посмотри на решение. Теперь я не могу понять, почему в ответе появляется писанина "7777" в конце? Укажи на мои ошибки, дай советы по оптимизации кода.
>>453224 >Тут каждую неделю по несколько анонов эту задачу выкладывает и у всех получается 59к, а нужно 61, я уже скоро наизусть выучу. Если ты не веришь мне, дождись ОПа. А я не выкладывал, но у меня 61 было.
>>453238 Вижу свою ошибку уже сразу: 7777 не прибавляется по методу, который мне посоветовал >>452943. Пока не могу додумать, как прибавить разовую таксу.
>>453239 Она прибавляется, поэтому у тебя в конце 7777 и пишет. Фишка в том, что сама функция ничего не возвращает и соответственно 777 к нулю прибавляется.
Так быть не должно. Не уходи в минус. Школьник же не переплачивает. Если нужно выплатить меньше 5000, так и плати меньше 5000. Ещё и 14ый месяц вылез откуда-то.
>>453143 Блин, весь день спал, а никто и не чекнул мою задачу за это время, ну посмотрите может быть хотя бы те кто уже решал и сечет в ООП, укажите на пару недочетов? >>453165 Я тебе советую выводить echo для наглядности на каждой итерации цикла например, и нормально форматировать код, а то я сначала ничего не понял в твоей стене и хотел тебе указать что у тебя month++; дублируется с $month = $month+1; и только потом понял что это костыль внутри условия if() {}
После того как ты все отладишь, то эхо можно будет убрать имхо.
>>453313 Проблема в формуле. Её надо переделать. Нельзя не уходить в минус, когда у тебя сначала отнимается ежемесячный платеж, а потом уже идет проверка оставшейся суммы кредита.
>>453327 Всё верно, я обосрался. Буду внимательнее.
Первоначальный взнос должен прибавляеться к кредиту. Так сказано в задаче. А в твоём решении его спрашивают после того как кредит погашен. Банк теряет с этого процентики, нехорошо.
И как удаётся школьнику погасить эту сумму на следующий месяц. Причём не зависимо от того как взнос велик, он будет погашен за 1 раз.
Кстати ОП, ты так и не сказал мне как лечить >>451696 Так, ты еще говорил что тебе не нравятся константы в родительском классе Сотрудников, я завтра это исправлю.
Если filteredEmployees пустой массив то в newLeader будет false и разумеется ты не можшь к нему обратиться. Достаточно поставить var_dump($newLeader, $filteredEmployees) (не print_r) перед этими строчками чтобы это увидеть.
> ты еще говорил что тебе не нравятся константы в родительском классе Сотрудников Мне не нравится когда родительский класс знает какие у него будут дети.
Предок ничего не должен знать о своих потомках. Он не должен обращаться к их методам, и не должен перечислять их список с помощью констант. Потому что ты сейчас, когда пишешь класс Employee не знаешь как он будет использоваться и кем. Может кто-то скачает твой код с гитхаба и подключит в себе проект и захочет добавить пару профессий. А констант для них в Employee нету.
> С тех пор, как тронувшиеся умом разработчики РНР решили запретить невинную библиотеку mysql, Там была объективная причина: библиотека для работы с mysql использовала код, права на который по моему принадлежади Oracle. Соответственно эта корпорация могла бы тормозить ее развитие. Да и справедливости ради, ничего хорошего в ней не было, примитивная процедурная библиотека без ООП.
PDO объективно лучше чем старое расширение, он поддерживает не только mysql но и другие базы данных, он написан с применением ООП. он умеет выкидывать исключения. Конечно и в нем есть некоторые ошибки, но он точно лучше старого кода.
Автор по моему просто то ли не любит ООП то ли не вполне его осилил.
>У PDO свой собственный хитровыдуманный способ соединения, называемый DSN Этот способ записать параметры соединения придуман не разработчиками PDO, он использовался много лет до этого в майкрософтовских, явовских библиотеках, в ODBC по моему тоже. Википруф: http://en.wikipedia.org/wiki/Data_source_name
То есть это не велосипед. а как раз привычный другим разработчикам подход.
> Поскольку практически КАЖДЫЙ мануал по PDO считает своим долгом продемонстрировать в корне неверный способ обработки исключений, я должен сделать специальное пояснение. > ... > Так вот, дети, запомните: так делать не надо НИКОГДА. Абсолютно верно.
> Используя этот метод, всегда следует предпочесть bindValue()? поскольку поведение bindParam() не очевидно для новичков и будет приводить к проблемам. Верно
> а в качестве краткой рекомендации посоветую применять fetch() в режиме FETCH_LAZY: не уверен что это выгоднее. Это надо тестировать и мерять, а не предполагать наугад.
> PDO и оператор IN Лучше не писать свой код как там написано, а использовать библиотеку поддерживающие массивы. например Doctrine DBAL.
> (или посмотреть, все-таки, в сторону SafeMysql, в которой этот, как и многие другие вопросы, решены просто и элегантно Пиар своей библиотеки. Лучше наверно использовать более широкоизвестные библиотеки.
> Это можно сделать, если принять соглашение, по которому имена полей в форме будут соответствовать именам полей в таблице. Тогда эти имена можно будет перечислить только один раз (в целях защиты от подмены, о которой говорилось выше), и использовать небольшую функцию-хелпер для сборки запроса, которая, в силу особенностей mysql, годится как для INSERT, так и UPDATE запросов:
Автор не удержался и начал придумывать свои странные велосипеды. Не стоит привязывать функцию работы с БД к функции сбора данных из POST и смешивать это вместе. Это плохо.
> $allowed = array("name","surname","email"); // allowed fields > $sql = "INSERT INTO users SET ".pdoSet($fields,$values); Заметим что массив allowed нигде в коде не используется. Опечатка или ошибка где-то в этом коде наверно.
Ну и как я написал выше, функция pdoSet как раз плохой пример так как смешивает работу с POST и с базой данных.
Так что в общем все верно, но те места где автор предлагает свой код и свою библиотеку, лучше пропустить.
Если ты не освоил гитхаб, загружай на gist.github.com, там работает перетаскивание и по моему можно даже анонимно грузить. Там код смотреть удобнее и быстрее чем скачивать архивы и распаковывать.
HTML валидатор http://validator.w3.org/ показывает 13 ошибок в HTML коде. Очень жаль, что ты не проверил свой код перед тем как мне его отправить, хотя я просил проверить.
Исправь все ошибки, на которые указывает валидатор, или напиши почему ты вынужден был написать код с ошибками. Если тебе непонятен текст какой-то ошибки, я готов помочь. Но пока код не будет проходить валидацию (или не будет объяснения по каждому случаю отступления от стандарта), я его проверять не буду.
>>453461 Там alt для картинок не указан и что-то со шрифтами, которые я вставил, ну альт я могу добавить, а шрифты я вставил с гугл фонтса и другого сайта, который ты мне посоветовал.
Отображение ошибок включено? В этом случае при ошбках php выведет сообщение.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
Не знаю даже, огорчишься ты или обрадуешься, но в компьютерной арифметике есть +0 и -0 (а также бесеконечность которая в PHP обозначается как INF и не-число NaN): http://habrahabr.ru/post/112953/
> Зачем нулю знак (или +0 vs -0)
> Любознательный читатель вероятно уже замелил заметил, что в описанном представлении чисел с плавающей запятой существует два нуля, которые отличаются только знаком. Так, 3·(+0)=+0, а 3·(-0)=-0. Но при сравнении +0=-0. В стандарте знак сохранили умышленно, чтобы выражения, которые в результате переполнения или потери значимости превращаются в бесконечность или в ноль, при умножении и делении все же могли представить максимально корректный результат. Например, если бы у нуля не было знака, выражение 1/(1/x)=x не выполнялось бы верно при x=±∞, так как 1/∞ и 1/-∞ равны 0.
Так как при сравнении -0 должен равняться +0, то это не вызвыает проблем. Я ни разу в жизни не видел ни одного бага из-за этого.
Задачу про айфон решал? Не решал ведь. надо просто код от той задачи засунуть в функцию.
В твоем случае у тебя нет проверки чему равен долг. Если долг маленлкьй надо платиь не 5000 а сколько осталось. Если долг дошел до нуля то платить больше не надо.
> поясните, я ошибаюсь PDO на самом деле удобнее и я просто не всё понял? PDO умеет выбрасывать исключения при ошибке а в mysqli ты должен писать if с проверкой после каждого вызова функции.
> Мне как-то показалось что писать что то такое: > Будет довольно напряжно Пиши нормальный запрос вроде
$stmt = $pdo->prepare('INSERT INTO t (a, b, c) VALUES (:a, :b, :c)');
> вдумчиво и пережевывая подается док с пхп,нет Но не быстрее и не проще ли прочитать самому эту документацию? Ну и мое мнение, начинающему равновато браться за сложные вещи вроде двоичной арифметики (& | ^). Эти темы надо изучать отдельно с разброром что такое довичные числа, биты и т.д.
> Можно как-нибудь проверять, что приходит в функцию? > А я как раз делаю конструктор сотрудника и хочу что бы туда сразу передавался его ранг в виде int и то, начальник он нет, в виде bool.
Можно через ифы:
if (!is_numeric($rank) || $rank < 1 || $rank > 3) { throw new ArgumentException("rank must be a number, '$rank' given"); }
ассерты хороши тем что как бы документируют код, показывая что автор кода ждет.
> Например у меня будет человек повышаться в ранге. Соответственно нужно делать 2 переменных под зарплату? Можно хранить только базовую ставку которая никогда не меняется, а зарплату не хранить нигде.
> как я понимаю родитель не знает о данных своих наследников? Да. Так как ты не знаешь кто и как будет наследоваться от твоего класса. Вдруг кто-то скачает твой код с гитхаба и унаследует один из классов? Ты не можешь заранее этого знать.
> Могу я составить конструктор в родительском классе, и использовать в нем данные наследников? Ты можешь обращаться только к тем полям и методам которые есть в родительском классе. Но ты можешь объявить поле или метод в родителе и переопределить в наследнике — это допустимо. Опять же вспомни что кто-то может унаследовать твой класс в будущем.
> Если у сотружников в зависимости от ранга или лидерства меняются параметры, то мне в конструкторе это дело по хардкору настраивать лучше? лучше не хранить такие параметры нигде.
> Или просто потом сделать функции которые будут это дело сразу высчитывать в процессе? да
> $this->salary = $this->defaultSalary $rankBonus $leaderBonus; Ты не должен обращаться к полям которые появятся только в начледнике. Это неправильно так как если кто-то унаследует твой класс и не объявит там поле то код сломается.
C MVC мы сталкиваемся в дополнительных задачах ссылки на которые стоят в ОП-посте. MVC нет особого смысла изучать само по себе, надо на примере написания кода иначе ничго не запомнишь.
> Ну или посоветуй норм источник почитать. не знаю, погугли на хабре например
> тут мозги не парьте, копируйте и все это плохой учебник если не объясняет
Вообще htaccess это файл задающий настройки веб-сервера. Там обычно используется mod_rewrite - это модуль который позволяет задать какой php файл мы вызываем при обращении по оределенному URL. Ну например при обращении по URL
/news/12
вызывать файл news.php
> разбиваем урл, первый кусок будет классом, второй кусок будет методом, остальные куски будут параметрами Это не обязательно. делать можно так как удобнее. Например в /news/12 news это название раздела а 12 это id новости.
> а шрифты я вставил с гугл фонтса и другого сайта, Там ошибка в том что & это спецсимвол и его надо вписывать как & в тексте и атрибутах. Эти 3 символа
< > &
надо вставлять через HTML мнемоники и верстальщик должен это знать.
> для чего нужно ставить паблик, приват и протектед перед этим? Ты разрешаешь или запрещаешь другим программистам обращаться к полям и методам. Поля лучше все сделать закрытыми так как в этом случае поменять их значения можешь только ты. Никто другой не может вписать туда неправильные значения (а если он их передает тебе через метод то ты можешь их там проверить). То есть это повышает понятность (я когда хочу понять как использовать класс смотрю только на public методы) и надежность (никто не запишет тебе отрицательную зарплату в поле).
То есть класс получается как закрытая коробка: ты можешь нажимать на оставленные автором кнопки (методы) но не можешь залезть внутрь.
>>453480 Ура, наконец-то ты дошел и до моей задачи. Это единственное замечание? >Ты не должен обращаться к полям которые появятся только в начледнике. Это неправильно так как если кто-то унаследует твой класс и не объявит там поле то код сломается.
Я голову ломал как сделать так, что бы 1 раз грамотно сделать эту функцию, и не копипастить её для каждого класса. В таком случае мне нужно просто родителю добавить это поле? Или мне нужно для каждого наследника в таком случае одинаковый метод вводить??
> я нахожу кучу проектов по доработке сайтов на джумле/вордпрессе (второе преобладает) + написание плагинов для них, и тут я в ступоре. Это днопроекты в основном. CMS (Джумла и вордпресс) рассчитаны в первую очередь на создание сайтов без программирования, лишь нажимая кнопочки в админке (максимум верстку порезать и добавить). Вордпресс вообще ориентирован на хипстеров который может придти в кофейню с макбуком и не напрягаюсь развернуть блог чтобы постить фотки и длинные глубокомысленные тексты без абзацев. Ну а джумла ориентирована на веб-студии, делающие сайт за 3000 рублей. Имей это в виду.
Собственно, чтобы их осввоить, достаточно прочесть мануалы с оф. сайтов. Пользовательский мануал раскажет как пользоваться админкой, а мануал для разработчиков (designer docs) расскажет как натянуть верстку и может написать плагин. Документация наверно на английском, но у вордпресса что-то есть в русском переводе. Их освоение у тебя максимум неделю займет. Ну и еще надо найти самые популярные плагины к ним и запомнить для чего они нужны.
Если ты хочешь, я могу придумать задание на тот же вордпресс, которое включает в себя и натяжку макета и может быть написание своего плагина. например сделать аналог siliconrus.com или что-то похожее. Но сначала глянь документацию.
> допустим у чувака интернет магазин на какой-то cms-ке, у него там в корзине какие-то поля есть, он просит добавить, например, выбор цвета для товара/добавить новые поля/еще какая-то параша которая, как я понимаю, связана с работой с бд. Но как это сделать?
Первым делом умнее всего глянуть документацию к CMS и погуглить. Может там есть возможность, может нет. Менять код сторонней CMS большая глупость так как ее потом нельзя будет обновлять (но неграмотные разработчики с фриланса часто так делают ради экономии времени). Вообще, меня жутко бесят люди которые что-то правят в сторонних библиотеках. Это рано или поздно принесет проблемы и кому-то придется их исправлять.
> Лезть в скрипт той же корзины, искать где там добавление товара в базу, предварительно добавлять в базу еще одно поле (если чуваку цвет нужен например), и добавлять? ну может и так, не знаю. Может в CMS есть система событий (хуков) или расширений и ты можешь допустим добавить чтобы перед вставкой вызывалась твоя функция и она там добавляла поля (в Друпале обычно так делают). Ну то есть если ты сделал свое расширение, ты можешь в нем сделать функции с определенными именами и они будут вызываться при тех или иных событиях.
> В целом вообще не понимаю, как работать с БД и вносить поправки в скрипты в этих ебаных CMS. Работать с Бд через функции API. Вот например в вордпрессе есть $wpdb:
Я бы тебе конечно советовал осваивать нормальные фреймворки вроде Symfony 2 или Yii2. на них правда заказов меньше но там ты будешь более менее с адекватным кодом работать.
> public function addWorkers($amount, $class, $rank, $leader) { > for($i=1; $i<=$amount; $i++ ) { > $this->workers[] = new $class($rank, $leader); Это лучше вынести из департамента. А то у тебя нельзя просто создать объект работника и добавить в департамент. Лучше сделать функцию вида
addEmployee(Employee $employee)
> $totalDepStuff += $worker->$stuff; Тут конечно лучше бы было сделать несколько функций, или хотя бы константы для вида статистики и условие вида:
if ($stuff == Department::STAT_SALARY) { $total += $worker->getSalary(); }
так сразу будет видно какие виды статистики есть и нам не придется использовать обращение по имени поля.
> public function setSalary () Функция в предке не должна обращаться к полям (defaultSalary) которых нет в предке.
Также я бы советовал не хранить поле salary вообще. Ведь в твоем примере тебе надо как-то отследживать смену ранга/статуса босса и пересчитывать зарплату. Зачем усложнять себе жизнь?
> $spases = str_repeat(" ", ($length - $strLength - 1)); Здесь надо бы проверять чтобы не получилось отрицательное число.
Ну и также, я вижу, ты у нас сообразительный, предлагаю тебе сделать дополнение к этому заданию которое научит тебя еще лучше понимать ООП и писать более правильный код:
> Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
> Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, страны запада разразили мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
> 1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
> 2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
> 3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
> Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
Также, если бы ты поменял поля на закрытые (protected/private), было бы неплохо. Но это не обязательно.
> Анон платит 2 месяцев. Заплатит 2028.97 банку SOFTBANK. Не 2 месяца, а 1.
> $homoCredit = totalPay(...) какой смысл это писать если у тебя в функци нет return и она всегда возвращает null?
Ну и код будет лучше если функция не будет ничего выводить, а только возвращать цифры через return. А тот, кто ее вызывал, уже сам выведет результат как ему нравится.
> Прикинул стек, который мне для этого нужен: Я бы прежде чем писать велосипед с нуля, спросил себя: нельзя ли использовать CMS или фреймворк? Например если сайт в основном информационный и содержит статьи то можно использовать вордпресс, если это магазин то магазинную CMS. С другой стороны фреймворк позволяет тебе написать что угодно, не ограничивая рамками. тут вполне подошел бы Yii2.
> могу ли я расчитывать на получение работы джуном в ДС2 например? Все зависит от компании. Скорее да, чем нет. С другой стороны, говорят сейчас кризис и нанимают меньше людей и требования выше.
> , если цикл придет к значению $totalCredit < $monthPay, то анону нужно будет заплатить меньше 5к, именно поэтому я ввел эту строку. Да но проверять это надо после добавления процентов и комиссии, а не до.
> Анон платит 13-й месяц. Заплатил уже 65000. Остаток задолженности -3729.8132554793. Как может быть отрицательный долг? Школьник что ли переплатил и теперь банк ему должен? Так не должно быть.
Если подставить кредит = 1000 то пишет что отдавать его 2 месяца, а это неверно: http://ideone.com/yC5lX8
> а никто и не чекнул мою задачу за это время, Оп тоже полдня проспал, что поделать. Не скучай. решай пока другие задачи, рано или поздно и до тебя очередь дойдет.
> PHP Notice: Undefined variable: total in /home/nz8lPL/prog.php on line 10 Эту ошибку надо исправить. ну и в минус лучше не уходить. лучше не платить всегда ровно 5000 а смотреть сначала чему равен долг.
> Я в каждой конкретной специальности прописал в параметрах необходимые значения зарплаты, кофе и документов. И в файле создания департаментов (department.php) изменил добавления сотрудников. А при выводе почему-то все эти значения остаются пустыми.
callback функция (функция обратного вызова) это когда ты передаешь в функцию другую функцию, и та ее вызывает. Они используются например в таких функциях как:
Пока довольно слабо сделано и много чего надо исправить.
> <div id="webpaint"><a class="logo" href="">ebpaint</a></div> Вот это нехорошо с точки зрения индексации поисковиком. Что он прочтет? Ругательное слово ebpaint, а лучше бы он прочел Webpaint чтобы нас можно было найти по этому слову.
Я бы вообще логотип сделал картинкой. Либо ты можешь использовать такую продвинутую технику как image replacement, когда мы выводим слово текстом и кладем поверх картинку так что поисковики, люди с отключенными/недогрузившимися картинками и программы, читающую страницу вслух, смогут слово прочесть.
Ну и не придется шрифт подключать ради 7 букв.
Буква W в логотипе не кликабельна. Буква W неправильно выровнена относительно букв ebpaint по вертикали, а сами буквы крупнее чем на макете.
Далее, верстка сделана очень криво. Посмотри пикрелейтед, как макет выглядит перекошенно на разных размерах окна браузера.
Слева от заголовка белая вертикальная полоса.
При маленькой ширине портфолио уезжает вправо, а список из 4 колонок переносится (хотя они могли бы просто стать чуть уже).
Чтобы этого не было, лучше поместить все блоки в контейнер(ы) который может тянуться от и до определенной ширины. При минимальной ширине поля у страницы например 20px (чтобы текст не упирался в край экрана), затем при увеличении ширины середина растягивается, затем при достижении максимальной увеличиваются поля, а середина остается на месте.
Мне кажется тут реально минимальную ширину сделать 1111px (по ширине портфолио). А в надписи branding agency вместо br сделать автоматический перенос строки.
Размер текста
> We are Webpaint > digital&branding agency based
Больше чем на макете. Сам текст должен быть сделан более тонким/легким (не 400) шрифтом.
Вообще, у тебя все надписи крупнее чем надо.
Ты возможно напутал с размером текста из-за использования pt. В фотошопе (как и в типографике) пункт это по моему 1/72 дюйма и число в пикселях рассчитывается через указанное в документе разрешение (dpi). В общем я не уверен но скорее всего если в фотошопе текст имеет размер 16pt то в css это 16px.
В CSS pt это 1.25 пикселя. Ты можешь прочесть в стандартах определение про 1/72 дюйма, но я ни разу такого не видел на практике. Может быть при печати это так, не знаю.
Заметь что там довольно сложное определение пикселя. Это связано с появлением ретина-экранов. Раньше 1 css пиксель всегда соответстовал 1 пикселю на экране, но с ретиной все бы стало слишком мелким, и им пришлось придумать более хитроумное определение (в итоге на ретине 1 css пиксель отображается как 2×2 пикселя).
Единицы измерения вроде mm, cm, in предназначены в первую очередь для печати на бумаге. На экране удобнее использовать px и em когда мы хотим привязаться к размеру шрифта.
И никогда не размер шрифта к размеру окна браузера (через vw). Во-первых при уменьшении окна шрифт станет нечитаемым, во-вторых при увеличении масштаба шрифт не увеличивается. бить бы таких горе верстальщиков стандартами по голове.
На кнопке See portfolio сама кнопка не кликабельна, только текст.
На иконке часов (Elit Ultricies) я вижу артефакты сжатия JPEG, ты ее не из джипега вырезал? Также, часы выводятся чуть обрезанными слева. Верстальщик должен видеть такие вещи.
Фотоаппарат как-то некачественно обрезан, если посмотреть картинку /images/services.png то видны следы ластика. Ты не умеешь в фотошопе отключать фоновый слой? Это плохо конечно. Лучше отключить фон и скопировать иконку на прозрачном фоне чем руками пытаться его удалить.В фотошопе alt + клик по «глазу» на слое оставляет видимым только этот слой (а правый клик инстурментом Rectangular Marquee показывает список слоев под текущей точкой).
Надписи SEE PORTFOLIO, GRAPHIC надо сделать нормальными, а капс лок сделать через CSS.
> checked="checked" В HTML можно писать просто checked
> <a href="" class="navigation" id="active"> active лучше сделать классом, id обычно обозначает конкретный элемент.
> pbutton Я бы советовал давать более читаемые и понятные названия. portfolio-button например.
> <div class="spritecontainer" id="android"></div> Фоновую картинку лучше наверно добавить через псевдоэлемент before.
> <div class="portfolioimage"><img src="images/portfolio1.jpg" alt="picture"></div> замени дивы на ссылки тут
> <div class="socialnetworks" id="facebook"> лучше сделать все классами, например class="social-networks social-facebook" так как id неудобы при верстке. Я советую реже использовать id или не использовать вовсе.
Аноны, посмотрите пожалуйста на эту попытку написания валидации для форм, для задачи про студентов. Там может немного запутано показаться поэтому поясню немного, суть в том что я не смог в одну функцию поместить и очистку строк при помощи при помощи trim и т.д. и непосредственно проверку правильности (количество символов и т.д.) Поэтому метод clear() чистит строки от ненужных символов, после этого передаёт уже очищенный массив, который используется для нового объекта который уже через метод validate() проверяет другие параметры и возвращает массив ошибок в случае чего. У меня такое ощущение что я очень раково всё выполнил, если я использую подготовленные выражения то мне нет смысла чистить строки через тримы и т.д.? Вот код http://ideone.com/A8d8hi
ОП, подскажи нубу, вкатившемуся из других языков. Пробежался по задачкам -- все что в туторах могу решить, сложности возникают пожалуй лишь с задачами среднего уровня (до пхп писал на c# и с++)
Так вот, после строгих шарпа и си++ (особенно последнего) я никак не в могу в нормальный код на пхп.
Я не понимаю, как правильно разделять, что называется логику и представление в пхп, если я не хочу ставить себе фреймворк (там модель построения вынуждает это делать я так понимаю) ?
В примере понятно что ajax бесполезен, но я именно для примера привел: есть вот js/ajax код какой-то, есть хтмл в который надо внедрить пхп, есть сам пхп код. Как правильно разделить? Если с js можно в отдельный файл его пихнуть и подключить, то как быть, когда мне нужно в хтмл внедрить пхп? Смотрю на эти echo в которых печатаются хтмл-теги и интуитивно понимаю, что это говно.
Такой вопрос. Я прочитал в книге про то, как делать отправку электронных писем с ПХП. Как сделать так, чтобы отправлялось содержимое текстового поля textarea? В jQuery есть метод .val(), который возвращает содержимое поля. В ПХП есть что то подобное? Или может как то можно добавить в переменную содержание поля?
>>453746 в хтмл у текстареи указываешь атрибут name, например name='info', а у формы его содержащей action и method. в пхп его содержимое ловится как $_POST['info'] или $_GET['info'] в зависимости от метода и дальше уже делай с ним что хочешь. дочитай до форм, постов и гетов и все поймешь.
Пацаны, сорри за совсем кретинский вопрос, а в чем профит социальных кнопок, что происходит когда я тыкаю на сердечко на каком-то постороннем сайте? сыч без социалок
О великие техно-демиурги, о цифровые монахи что общаются посредством бинарного кода. Мыслители анализирующие музыку сфер. Вообщем, пока я не докатился до переменных $fuck и $ass мне срочно нужен разбор полётов от вас, великих мудрецов и мыслителей. Задача про школьника, айфон, кредит. Задача от гения педагогики-Опа - исправить в коде то, что позволяет школьнику переплатить и оставить банк в должниках.
Идея была такая - через переменную break определять состояние долга до последней платы. Т.е. минус один месяц. Потом через if проверяю, меньше ли долг чем 5000 и к break добавляю сколько там долга.
Не знаю как это называется, костыль или мозгоёбство, но это то до чего я дошёл своим куцым умишком. Прошу снизойти и показать как нужно/показать где я не прав в своём решении. Сука, сонный блядь http://ideone.com/wm6tW8
Заминочка с Yii. Суть такова: надо вывести связанные таблицы (книги и жанры, многие ко многим), желательно через виджет CListView. http://ideone.com/njRtI5 Выдает ошибку:
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'genre.genre_id' in 'where clause'. The SQL statement executed was: SELECT `t`.`book_id` AS `t0_c0`, `t`.`book_title` AS `t0_c1`, `t`.`price` AS `t0_c2`, `t`.`quantity` AS `t0_c3`, `t`.`description` AS `t0_c4`, `t`.`image` AS `t0_c5`, `t`.`date` AS `t0_c6` FROM `book` `t` WHERE (genre.genre_id=:genre_id) LIMIT 20
Что интересно, если отключить пагинацию 'pagination'=>false, то ошибки нет (но и пагинации, ес-но). Насколько я понял, то ли он это условие WHERE подставляет до того, как сделает JOIN таблиц, то ли сует его в запрос пагинатора, который должен возвращать кол-во записей. Блин, целый день угробил на это. Если не подскажете, придется лепить отдельно в форыче вывод записей и цеплять к ним объект пагинации. Но таки предпочтительнее было бы это сделать средствами CListView.
Как наиболее красиво написать следующую конструкцию:
if (первое условие) { действие необходимое для получения данных для второго условия; if (второе условие) { } else { действие 1; } } else { действие 1; }
как видно тут повторение "else { действие 1; }" что не есть красиво, какие у вас есть варианты? (можно с goto, но оно же зло)
>>453978 Я тебя понял на столько насколько тебя понял. if (первое условие) { действие необходимое для получения данных для второго условия; if (второе условие) { действие 1; } else { действие 2; } }
Поясните можно ли всё что идёт после этого блока который в самом вверху:
<?php include "inc/bd.php"; include "inc/student.class.php"; include "inc/form.class.php"; $allStudent = Student::outAllStudent($pdo); ?>
Забросить в шаблон? Не будет ли это нарушением логики приложения, ведь основное что на этой страницы есть получение массива студентов из базы данных, можно ли закидывать foratch в шаблон или это нарушение?
Ох, на свежую голову посмотрел - сколько я хуиты понаписал, ё маё. >>453973 Спасибо, мессир. Я исправил, но получилась снова хуйня - код не хочет платить последнюю хапку так, чтобы получилось 61 тысяча, а я слышал, что мудрецы здесь отвечали кому то, что должна быть 61 тысяча. Ожидаю прихода Всесветлейшего. http://ideone.com/gJGpym
>>453997 Потом остаток кредита проверяй перед тем как платить, говорю я.
Сначала банк начислил все проценты. И потом, перед самой выплатой начинаешь проверять, сколько собственно Анон должен банку. Больше 5000, то выплачиваешь 5000, если меньше, то выплачиваешь ровно столько сколько осталось.
>>453993 я не конкретную задачу, просто не первый раз встречаю такую конструкцию, хотелось бы красивое решение. нет заранее не подходит вдруг там запрос к базе - лишняя нагрузка
Что то у меня сумбурненько проходит обучение. Сел поиграть в дотку, и почти месяц внезапно пропал.
https://github.com/tokotun/uppy ОП, если анализ займет мног времени, то просто укажи на несколько первых ошибок, что б я сразу их начал исправлять.
>А ты все файлы в одну папку кладешь? Что если загрузить 2 файла с одинаковым именем но разным содержимым?
Это я предусмотрел. Имя файла хранится в БД. А в сам файл меняет имя с "picture.jpg" на "GhKEGFeeqJ" А когда скачивается, то файл получает обратно своё имя из БД. Насколько это решение правильно незнаю
>Обычно эта ссылкалевый верхний лейбл UPPY ведет на главную. Непонятно почему она разная в разных шаблонах.
Потому что так сделано в RGhost.ru. Там кликом по лейблу можно переключатся между страничкой загрузки и страничкой закаченных файлов. Я же его копию делаю.
>В форме поиска надо добавить кнопку. Я не уверен что без кнопки она вообще будет отправляться.
Запрос отправляется нажатием на Enter. Опять же слизано с RGhost.ru, там рядом с поиском нет кнопки "отправить".
> header('Content-Disposition: attachment; filename=' . $this->name); >https://github.com/tokotun/uppy/blob/master/uppy/app/functions.php#L7 >для опции filename разрешено использовать только латиницу (ASCII если точнее). русские буквы разные браузеры понимают по-разному. Лучше не используй эту опцию вообще.
мм... Именно эта опция отвечала за переименование файла. Из ..\uppy\container\GhKEGFeeqJ в .\uppy\container\filename.jpg Тогда, мне придётся поискать альтернативу. Пока на примете 2 варианта. Или вовсе не менять имя файла на уникальный код. И тогда не смогу хранить файлы с одинаковыми именами. Или сделать велосипедную свистопляску - перед скачиванием загружать под исходным именем этот файл в какую-то папку. А потом уже этот переименованный файл отдавать на скачивание. Ну, или какие существуют варианты этого решения?
>Я думаю, удобно при загрузке из БД преобразовать дату из mysql в php формат. А при вставке делать обратное.
Не уверен что правильно понял. Это нужно, для того, что б из такого формата "2011-06-10 15:18:00" переделывать в такой “4 июня 2011, 14:57″ ? Верно?
>Ты отключил выполнение php скриптов в папке загрузок?
Нашел такое решение - создать в каталоге с файлами .htaccess
но файлы у меня закачиваются без расширений. Нужен ли такой вариант?
Пытался сделать древовидные коментарии, но там с формой для отправки сообщений возникли проблемы. Её ведь аяксом подгружать надо. Тогда буду доделывать их позже, когда аякс изучу.
И касательно метаданных, в какую сторону копать что б их првильно извлекать.
Вопрос по Yii2, сам фреймворк это как каркас сайта насколько я понял, так вот допустим если я наполню этот каркас изменяя исходный код, как приступить к разработке второго? скачивать заново, или есть возможность обнулить изменения на исходный код? Или я не так понял суть фреймворка?
> А в сам файл меняет имя с "picture.jpg" на "GhKEGFeeqJ" Я не советую делать такие имена. Представь у тебя какие-то пробелым с сайтом, ты лезешь в папку и там 1000 таких файлов. Имена надо стараться делать читаемыми, а для уникальности можно например использовать id (если он известен в этот момент). Чтобы если что, можно было разобраться.
> мм... Именно эта опция отвечала за переименование файла. Альтернатив несколько. Во-первых, там есть какой-то новый стандарт по которому можно добавлять кодировку в поле filename. Но лучше использовать древний проверенный способ. когда имя для скачивания указывается в конце URL
/download/123.txt(реальное имя на диске)/document.doc
Чтобы это реализовать ты можешь использовать 2 подхода:
- переписывание URL через modrewrite в htaccess - X_SendFIle когда сначала вызывается твой скрипт. а потом он дает команду Апачу отдавать конкретный файл.
> Или сделать велосипедную свистопляску - перед скачиванием загружать под исходным именем этот файл в какую-то папку. нет, это неэффективно. У нас на файлообменнике большинство нагрузки это просмотр файла и скачивание, и наша цель как можно проще это реализовать. Вариант с mod rewrite который переписывает URL
/download/123.txt/documents.doc
на
/files/123.txt
Самый эффективный. Вариант с X-SendFile помедленнее, но он хорош тем что там вызывается PHP и он может проверить что имя в конце (document.doc) не подменено, так же он может вводить ограничения на число скачиваний и т.д.
Ты в любом случае должен иметь представление какие варианты реализации есть, какие у них преимущества и выбрать тот, который лучше в данной ситуации.
> Это нужно, для того, что б из такого формата "2011-06-10 15:18:00" переделывать в такой “4 июня 2011, 14:57″ ? Нет, «PHP формат» это либо число unix timestamp котрое возвращает time() либо объект DateTime. С помощью стандартных функций ты можешь с такой датой работать. В в твоем варианте не можешь, надо сначала распарсить строку.
Мне кажется, что хранить дату в стандартном виде внутри объекта было бы удобнее.
> но файлы у меня закачиваются без расширений. Нужен ли такой вариант? Пусть будет как доплониетльная защита.
> Пытался сделать древовидные коментарии, но там с формой для отправки сообщений возникли проблемы. Её ведь аяксом подгружать надо. Тогда буду доделывать их позже, когда аякс изучу. Ты можешь пока сделать радиокнопки перед комментариями для выбора на какой отвечать. А в CSS3 браузерах еще и например подсвечивать выбранный комментарий. А потом переделаешь на яваскрипт.
Аякс тут не обязателен. Тебе незачем слать запрос на сервер чтобы передвинуть форму. Но аякс хорошо бы использовать при отправке комментария.
Аноны, если я кому-то советовал gitinore'ить composer.lock — я был не прав. Его все же советуют держать в репозитории чтобы у всех были одни и те же версии библиотек.
> maxFileSize' => 33554432, // 32 MB Там есть еще настройки php.ini которые ограничивают объем загружаемого файла. Я советую в README.md упомняуть эти настройки. таким образом, если я или кто-то захочет скачать и развернуть проект, он будет предупрежден что ему надо поменять чтобы закачивать большие файлы.
> 'templates.path' => 'uppy\\templates\\' Лучше прямые слеши так как они работают и под Win и под linux.
> $this->getID3 = new \getID3; лучше внедрять эту зависимость через конструктор, а еще лучше мне кажется сделать чтобы MediaInfo получал массив данных от getId3. Тогда этот объект не будет зависеть от getId3 и мы даже сможем например сериализовать его и засунуть в базу (но делать так наверно не надо).
Я думаю объект getId3 тоже стоит сделать синглтоном.
> finfo_file($finfo, $filePath) Сделай чтобы не было несколько повторябщихся вызовов
> var $result = NULL; var использовался в PHP4. Ты проходил мой урок по ООП? Мануал почитай что ли чтобы вспомнить современный php http://php.net/manual/ru/language.oop5.php
для полей и методов надо проставить public/protected/private
Продумай API класса MediaInfo. Ну то есть напиши несколько простых кусочков кода на 5-6 строк с его использованием и посмотри, можно ли сделать лучше? Например:
- вывести имя исполнителя и название песни из трека - сохранить медиаинформацию в базу и позже ее извлечь
удобно ли это делать с твоим API? Может можно сделать класс более удобным в исплоьзовании?
>Постарайся сам понять почему и как это работает. Да уж постараюсь теперь. Уже неделю сижу над такими мелочами. Придется забросить проект (хотя я надеялся сделать его за пару дней, там элементарщина казалось бы, только как ее реализовать средствами фреймворка) и сесть за суровые мануалы. Я понимаю к чему ты, типа не используй копипаст, не будь быдло-кодером. Но многим людям для мотивации обучения нужно видеть результаты. Поэтому хватаются за проекты, вместо того чтобы позадротить теорию. У меня дико горит от колоссальной затраты времени, которая не приносит пока видимых результатов.
Я тут мимопроходил, но я посмотрел на твой исходный вопрос и текст запроса:
> Column not found: 1054 Unknown column 'genre.genre_id' > Насколько я понял, то ли он это условие WHERE подставляет до того, как сделает JOIN таблиц, то ли сует его в запрос пагинатора, который должен возвращать кол-во записей.
Причина ошибки очевидна любому кто знает SQL: ты обращаешься к не использованной в запросе таблице или синониму, скорее всего забыл добавить JOIN. Так как ты используешь Query Builder от Юи то скорее всего забыл добавить вызов какого-то метода или неправильно его вызвал.
Что я хочу сказать: тебе надо сначала изчить язык SQL и потом изучить сам фрейморк (у Yii неплохая документация). Если ты не хочешь это изучать, то ты всегда будешь напарываться на такие грабли. ты можешь подумать что вместо изучения теории можно нагуглить овтет, но это помогает только в очень простых ситуациях. А как только у тебя будет ситуация посложнее, ты так же окажешься в тупике.
> Поэтому хватаются за проекты, вместо того чтобы позадротить теорию. Тебе надо хвататься за изучение SQL сначала.
> У меня дико горит от колоссальной затраты времени, которая не приносит пока видимых результатов. Потому что надо идти от простхы вещей к сложным (SQL -> Active Record в Yii), а не браться сразу за написание кода. Если ты не можешь руками такой запрос написать и прочитать, то браться за Юи рановато.
>>453446 >Ну как же так, мы же вроде разобрались тогда? Ну я просто до сих пор не понял почему так случается - почему он становиться пустым?
>это не очень правильно так как одна константа принимает разные значения в разных классах Разве нельзя одну константу использовать в разных классах? А как тогда быть?
Еще вопрос, как мне правильно унаследовать метод обращения к константе? Если писать в родительском классе self::CONSTANT - выдается ошибка что неизвестная константа.
>>454096 >Ну я просто до сих пор не понял почему так случается - почему он становиться пустым? Я даже с проверкой isset($newLeader) сейчас сделал - он все равно выдает ошибку, только уже о том что нельзя обращаться к типу boolean
Также, при исопльзовании mysqli надо проверять результат каждого вызова, чтобы получить информацию об ошибках, как я понимаю, а не пытаться продолжать выполнять скрипт.
То есть у тебя должно быть 2 файла, например list.php и templates/list.phtml
> if(is_float($amount/100)){ это плохая проверка, так как is_float не проверяет является ли число нецелым. Он проверяет только тип под которым оно хранится. Как пример:
var_dump(is_float(2.0)); // true
Проверять лучше взятием остатка от деления на 100: $x % 100
Когда ты тыкаешь сердечко, счетчик увеличивается, а в ленте твои друзья в соцсети видят ссылку на сайт. Они могут перейти по ней и например тоже кликнуть. То есть владельцы сайты пытаются поднять посещаемость. Но это работает только для популярных сайтов, на непопулярных эти кнопки с нулями/единицами только тормозят загрузку и все.
Ну и еще есть «расшарить» — это когда ссылка постится не только в ленту, но и на стенку и ее видят больше человек + поисковики.
> Ну я просто до сих пор не понял почему так случается - почему он становиться пустым? Поставь var_dump выше по коду чтобы понять на какой строчке он становится пустым и чему равны другие переменные. Посмотри что приходит в функцию, что делается с переменной дальше.
> Разве нельзя одну константу использовать в разных классах? А как тогда быть? По идее можно сделать отдельный класс с константами. Или назвать их по-разному. Вообще, в твоем случае можно наверно просто имя класса использовать, я подумал.
> Если писать в родительском классе self::CONSTANT - выдается ошибка что неизвестная константа. Ты не должен из предка обращаться к константам потомка.
> как мне правильно унаследовать метод обращения к константе? поясни подробнее, я не понял зачем тебе метод для обращения к константе.
>>454114 >поясни подробнее, я не понял зачем тебе метод для обращения к константе. Ну вот допустим в дочерних классах есть константа ИМЯ, я не хочу в каждом дочернем классе прописывать метод получения имени этой константы, тогда этот метод мне нужно прописать в родительском классе и далее унаследовать его.
>>454124 Или так: Мне нужно получить имя каждого дочернего класса, >я не хочу в каждом дочернем классе прописывать метод получения имени этой константы, тогда этот метод мне нужно прописать в родительском классе и далее унаследовать его.
Просто я сейчас понял что проблема заключается в том что я пишу self в родительском классе, и естественно получаю то его значение, а не то что в дочернем, не смотря на то что обращаюсь через дочерний.
проблема в том что ты используешь константы с одинаковыми именами и этим обеспечиваешь путаницу. Не используй одинаковые имена.
Константа это не поле. Ты не должен переопределять его в потомках.
Если тебе надо возвращать какую-то строку, разную для разных классов, удобно сделать в базовом классе абстрактный метод getsomething() и переопределять его в потомках. То что он абстрактный не позволит создать потомка не переопределив его.
>>454109 Спасибо за совет >Статические методы это не ООП Метод для вывода всех студентов, что бы не заводить объект для вызова одного метода и не заполнять его пустыми полями решил сделать статический метод. >Опять же на ООП не похоже Получил из метода в классе список всех студентов и преобразовал в массив через fetchAll, показалось что так удобнее, надо было в объект? >htmlspecialchars где? Кстати да, забыл использовать его, использовал strip_tags, trim и т.д. в методах, а как ты догодался? Или ты имеешь ввиду при передаче из шаблона надо переменные пропускать через htmlspecialchars?
По вот этому http://www.phpinfo.su/articles/practice/shablony_v_php.html так и не смог понять, вроде бы в шаблоне здесь используется пхп код, как его правильно разделять? В моём случае сама логика пхп скрипта в том что бы получить с метода список всех студентов, можно ли всё остальное засунуть в шаблон (может быть немного не в том виде в котором я сделал) а оставить только само получение этого списка?
> что бы не заводить объект для вызова одного метода В этом ничего страшного нет
> Получил из метода в классе список всех студентов и преобразовал в массив через fetchAll, показалось что так удобнее, надо было в объект? Массив объектов-студентов наверно. у тебя же все равно есть класс Студент?
Экранировать при вставке в базу неправильная идея. Это неграмотно. Так как данные в базе могут использоваться не только для вывода в HTML но и в других целях.
> использовал strip_tags, trim Потому что ты не знаешь как делать правильно и просто ставишь все функции подряд. Это неправильно.
> вроде бы в шаблоне здесь используется пхп код, как его правильно разделять? Код в шаблоне только для вывода данных. Не для их получения, подготовки, обработки и тд.
Статические методы там где надо использовать обычные это плохо. Ты не можешь например создать 2 копии объекта с разными настройками из-за них. также ты явно прописываешь класс:
>>454183 >В этом ничего страшного нет Проблема в том что в самом классе у меня 8 его свойств (name, email и т.д.) А передать мне надо только объект $pdo для вывода всех студентов, больше ничего не надо, поэтому мне показалось что создавать что то такое:
$student = new Student("","","","","","","",""$pdo);
Не знал как по другому использовать базу данных внутри класса, приходилось передавать через __construct объект PDO из вне, так совсем неверно да? Теперь то буду пользоваться дата мапером.
Привет. Нужна помощь. У меня есть таблица (смотри пик) цен на услуги полиграфической компании. Скажем, печать визиток. Задача состоит в том, чтоб сделать систему, где клиент нажимает на цену (синего цвета) и получает попап со строкой-подтверждением. Строка составляется из данных таблицы.
К примеру: мне нужно 500 визиток с Опцией #1.
Я нажимаю на цену 740 и в модальном окне у меня появляется строка: "Вы купили 500 визиток с Опцией #1 по цене 700 денег.
Можно вручную прописать все варианты типа (row-1, cell-5) + (row-3, cell-1) + (row-3, cell-5), но это же неправильно, хотя логика верна.
Таблица и модальное окно у меня уже реализовано. Все данные в таблице вынесены как параметры в бэк-энд. Мне нужна помощь с комбинацией значений. Как это решить на php?
>>454002 >>454107 Ваше благородство не знает границ, а интеллект - систем подсчёта. Сделал как сказал всесветлейший Оп Знаю, что скорее всего не так, но попытаться стоит, т.е.: 1) Задал переменные. 2) Начал цикл. 3) Внутри цикла подсчитал долг. 4) Открыл иф: Если долг меньше чем 5(пять) тыс. (тысяч), то приравниваю ежемесячный платёж = долг, вывожу, с меня хватит и брейк. Ежели нет, то плачу ежемесячный платёж. А ежемесячный платёж у меня сколько? Пять тысяч. уже с ума схожу. Так вот. Где мой ограниченный стенками черепа разум допустим ошибку или проглядел очевидные для магистров оккультного цифрового знания вещи? На горохе уже постоял, плоть укротил, жду ответа. http://ideone.com/9KW1LY
>>454585 > Где мой ограниченный стенками черепа разум допустим ошибку или проглядел очевидные для магистров оккультного цифрового знания вещи? В формуле расчета. Точнее это не твой разум, это хитрый оп там её оставил. Выплачивать долг, а затем проверять оставшуюся к выплате сумму - противоречит логике. Нужно делать наоборот. Но для этого придется разбить формулу на части.
>>454588 Спасибо за этот туманный и загадочный ответ, мессир. Буду ломать голову, если нихуя не выйдет - за советом приду только завтра, чтобы не примелькаться.
>>454592 Да не особо он и туманный, вот тебе алгоритм действий:
Начисляем проценты к кредиту (НО ни в коем случае от него ничего не отнимаем) Проверяем не меньше ли кредит нашей ежемесячной выплаты. Ну а далее в зависимости от проверки отнимаем что-то от оставшейся суммы кредита. Все просто, осталось только выразить это в коде.
>>454594 Спасибо тебе, медиум сетевой сферы! Так долго не отвечал потому что смотрел менталиста по тв3. http://ideone.com/FIohrE Я ещё у Опа хотел спросить, когда думал, что получится сделать его способом, почему именно такая логика, потому что это правда странно. Но Оп - педагогический гений и его пути неисповедимы, аминь
>>453544 >Это лучше вынести из департамента. А то у тебя нельзя просто создать объект работника и добавить в департамент. Лучше сделать функцию вида
>addEmployee(Employee $employee)
Мне тогда нужно перекроить по новой два класса? Суть в том, что у меня все неправильно с точки зрения ООП сделано как раз? Я должен делать каждый класс независимым? Я просто не хотел делать для каждого класса работника функцию добавления этого работника, а хотел вот таким вот трюком сразу заполнять большие департаменты. Я вообще немного не понял что тут должно быть: addEmployee(Employee $employee) что тут в скобках типа передается? Это такой тайпхинтинг просто? что в функцию долден передаваться уже готовый объект?
>>454050 > лучше использовать древний проверенный способ. Когда имя для скачивания указывается в конце URL ОП, я тупой я не понялхотя старался.
файлы решил сохранять не под именем-белибердой. А просто приписывать к имени файла номер id. Вот так 23_picture.jpg
На данный момент такие проблемы. Закачиваю файл с русским именем, имя превращается в кракозябры. При попытке скачивать ничего не происходит. Решение сам не нагуглил. Почти все советуют не сохранять в кириллице или заменять кириллицу на транслит.
Ты советовал. >лучше использовать древний проверенный способ. когда имя для скачивания указывается в конце URL Поделись ссылкой где про это написано так, что б даже я смог уловить суть.
>>454676 Так я тоже неимоверно благодарен, просто когда ты дал мне это замечание я не понимал что значит "платить" здесь. Здесь забавный момент, вот ты мне сказал это, потом в другом посте Оп примерно то же самое сказал (Хотя я запутался, кто здесь кто, но не важно). Я сижу и думаю "где здесь "плата?". Здесь нет ничего с табличкой "Плата". И я, внимание, прихожу к выводу: "Так плата то это зачисление в PlaymentTotal!". Т.е. думаю что когда я добавляю число в общий платёж и он выводится в stdout то это "Плата". ЛОГИЧНО? Лол. И только вот сегодня я понял что платёж это именно вычет ежемесячный платы и более того - нужно платить в каждом отдельном ифе по разному. Такие дела. Ещё раз всем спасибо.
>>454745 Я тупой, не понимаю в эти задачки, дошел до 3-4 и всё, код как-бы нормальный сам по себе, но работает через раз, и то не всё. вот думаю почитать что-то, чтобы заработало всё.
>>454747 >У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него.
Выкладывай решения на проверку и получишь советы и замечания. Также, если ты не можешь решить задачу, запости ссылку на уже написанный код и напиши что именно непонятно —получишь подсказку.
> Не знал как по другому использовать базу данных внутри класса, приходилось передавать через __construct объект PDO из вне, так совсем неверно да?
В этом ничего неверного нет. Непонятно только зачем ты PDO в класс Student передаешь. зачем этому классу доступ к БД? Ты прочитал про паттерны для работы с Бд по ссылке?
Плохо, что ты не написал что ты умеешь и знаешь, что до этого делал, может ты с Symfony 2 знаком, а может тебе сначала надо научиться с формами работать. Трудно так давать советы, не зная уровень знаний.
Регистрация: добавление пользователя в базу данных Авторизация: проверка логина/пароля на наличие в БД и если так, помечаем пользователя залогиненным с помощью сессии или кук. Стоит помнить что сессия это временное хранилище и неактивная сессия умирает через 20-30 минут. Если ты хочешь чтобы залогиненность сохранялась дольше надо либо использовать куки либо сессию+ куки. из которых она восстанавливается.
Вообще объяснять тут можно долго, потому я попробую дать ссылки для изучения (хотя по моему хороших объяснений найти трудно):
Во всех этих примерах код низкокачественный и приведен только для объяснения логики, так что не копируй его а пиши сам.
также есть уже готовые библиотеки для реализации логина, например Sentry (хотя у меня некоторые претензии к примерам кода там и статические методы это не лучшая идея): http://www.ibm.com/developerworks/ru/library/se-sentry/
Это логичнее решать на JS чтобы отображать цену без перезагрузки страницы и отправки запросов. Но можно делать и на стороне php, с лишними запросами.
Решить можно помещением цен из таблицы в массив и нехитрым скриптом суммирующим нужные значения. Я не очень понимаю, в чем проблема, потому если тебе что-то непонятно, напиши подробнее. Я также предполагаю что ты знаешь сам язык PHP и тебе не надо объяснять что такое массивы, циклы, if, функции и т.д.
Ты кстати знаешь что с помощью Github pages ты мог бы отобразить страницу с твоей версткой? Надо просто закоммитить файлы в ветку gh-pages и может что-то еще нажать в настройках репозитория: https://pages.github.com/
Теперь по поводу верстки. Пока все очень печально. При верстке ты должен стараться максимально соблюдать размеры шрифтов, поля и отступы, заданные в макете. У тебя эти соотношения многократно нарушаются и не соответствуют макету (смотри картинку). Многие отклонения очень большие и их легко заметить глазом.
Ты должен пользоваться инструментами вроде линейки в графическом редакторе, чтобы измерить размеры блоков и отступы. А при верстке правильно расставлять маргины и падинги и помнить про схлопывание отступов (margin collapsing).
Бывает трудно запомнить где какой размер, можешь нарисовать на листочке блоки и их размеры.
Также, видно что вес некоторых надписей не соответствует макету. Например, digital&branding agency based сделано шрифтом с весом около 300, но у тебя весом 300 сделана только курсивная надпись digital&branding. Почему? Очевидно потому что ты подключил к странице только шрифт весом 400 и 300 italic.
Веса шрифта можно увидеть например тут: https://www.google.com/fonts/specimen/Lato (заодно отмечу что пейринги Гугл подбирает неудачные: ну кто додумается использовать рядом похожие Lato и OpenSans?)
При этом надо помнить что HTML/CSS предназначены для отображения контента на разных устройствах с разным размером экрана и разрешением. Потому кроме соблюдения соотношений ты также должен продумать, как будет меняться страница в зависимости от размеров экрана.
На сайтах обычно делают середину тянущейся в ширину от и до определенного размера. А если страница становится шире то просто добавляются поля.
У тебя ничего не тянется. На узком экране портфолио уезжает вправо. На широком весь сайт едет влево. На маленькой ширине меню проваливается на 1 строчку вниз под логотип.
Опять же смотри картинку.
Это все надо исправить. Если есть какие-то затруднения или что-то непонятно, спрашивай.
Теперь про спрайты и эффекты при наведении. Во-первых, ты неправильно сделал картинки для hover в отдельном файле. В этом случае при наведении мыши в первый раз иконка мигает пока браузер не загрузит картинку. Картинку с иконками при наведении надо поместить в тот же файл.
Также, когда ты делаешь спрайт, не надо ставить картинки вплотную. Оставляй 5-10px промежутка. Иначе при масштабировании страницы из-за округлений вылезт края соседней картинки.
Теперь про эффекты. Их можно делать как в графическом редакторе, так и средствами CSS. Ну например ты бы мог рисовать круг за счет border-radius (а на картинке оставить только значок) и с помощью CSS затемнять/осветлять цвет при наведении. Можно с помощью box-shadow делать свечение вокруг при наведении. Можно смещать картинку или поворачивать на некоторй угол. Можно так же за счет переходов CSS3 transition сделать это плавным.
> выплачено всего 54138.172065718 руб. А должно быть 61к. Это из-за того что ты вот тут
> $creditBalance = ($creditBalance $percent) + $servicePayment - $monthlyPayment; Сразу вычитаешь 5000 независимо от того какой выйдет остаток. Это непраивльно.
Считает правильно, но давай посмотрим внимательно на код. Безупречен ли он? Нет ли в нем повторов? Нельзя ли отрезать от него лишнее? Конечно, можно. Смотри сам, эти строки повторяются:
О, действительно. мой совет мог быть не очень понятным. Под «платить» я имею в виду конечно уменьшение остатка долга, увеличение общей суммы выплаченного и вывод надписи.
нахождение максимальной длины можно сделать без цикла за счет функции array_map и max.
> for ($i = 1; $i <= $bigLengthString; $i++) Лучше считать от 0 чтобы не приходилось потом вычитать 1
> $arrayChars = preg_split("//u",$string); // Разбираем строку на символы Я думаю тут проще использовать mb_substr (для проверки не вышли ли мы за границу строки можно использовать mb_strlen)
Считалка
Код можно упростить. У тебя 2 цикла:
пока участников много { пока мы не дошли до конца круга { удаляем участинка; } поправляем значения; }
Но можно записать его так:
пока участников много { удаляем участника; если (вышли за конец круга) { подправляем значения переменных; } }
Ну и для удаления элемента с перенумеровкой можно использовать array_splice, это чуть помедленнее будет работать (так как перенумеровка будет происходить после каждого удаления) но тут это не принципиально. Можно и через unset удалять.
Для перенумеровки массива лучше использовать не sort а специально для этого сделанный array_values.
Там есть эффективный способ решения, а также можно решать ее (гораздо более медленно) полным перебором. Я опишу тут полный перебор.
Допустим есть сумма 16000. Чтобы определить как ее выдать мы должны перебрать все возможные количества купюр:
5000-е: от 0 до 3 (с учетом имеющегося запаса) 2000-е: от 0 до 8 (с учетом запаса и числа более старших) ... 100-е: от 0 до 160 (с учетом запаса и числа более старших)
«С учетом запаса» значит что если у нас всего одна 5000-я то рассматривать варианты размена где две или три таких купюры нет смысла.
«с учетом более старщих» значит что если мы допустим проверяем вариант в котором 3 5000-х купюры, то число 100-х меняется только от 0 до 10.
Полный перебор значит что мы должны проверять все возможные комбинации числа купюр. С учетом запаса и с учетом общей суммы разумеется.
Полный перебор можно реализовать рекрсией, когда за один вызов функции мы проверяем все возможные количества купюры определенного номинала. Примерно так:
перебор_5000х (сумма, запас) { для количества от 0 до минимального из (запас 5000-х, сумма / 5000) { делаем перебор 2000х(остаток суммы, запас); } }
Далее уже идут оптимизации. Например перебирать число купюр выгоднее не от 0 до максимального, а в обратную сторону, от максимального до 0, так мы скорее найдем верное число.
ну или ты можешь использовать оптимальный алгоритм из задачи о ранце.
> Мне тогда нужно перекроить по новой два класса? Скорее всего да
> Суть в том, что у меня все неправильно с точки зрения ООП сделано как раз? У тебя сделано не очень удобно и департамент занимается не своим делом (созданием работников). Не то чтобы это совсем плохо, но можно сделать гораздо лучше. Код с независимыми классами будет чище и универсальнее.
А так у меня есть объект-работник, как добавить его в Департамент? Никак. Плохо.
> Я должен делать каждый класс независимым? Смотря в каком смысле понимать независимость. В данной задаче думаю независимость в том что Департамент не создает работников сам, а оставляет эту задачу внешнему коду.
> Я просто не хотел делать для каждого класса работника функцию добавления этого работника Зачем? Сделай одну функцию добавляющую работника любого класса в департамент:
$dep->addEmployee(Employee $employee)
> Это такой тайпхинтинг просто? да
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
и по этому URL отдается файл то браузер сохранит его с именем hello.world
Если мы возьмем какой-нибудь файл на rghost, например http://rghost.ru/6vZkZdKVM и посмотрим инспектором (Ctrl + Shift + i) код кнопки «скачать» то мы увидим:
Видишь — ссылка для скачивания составлена так чтобы в конце шло имя файла и при скачивании браузер его использовал.
Соответвенно чтобы при скачивании файла задать ему имя, надо добавлять это имя в конец ссылки.
> А просто приписывать к имени файла номер id. Вот так 23_picture.jpg В этом случае php файл остается php файлом — довольно опасно.
> Закачиваю файл с русским именем, имя превращается в кракозябры. На windows файловые функции ждут имя файла не в utf-8 а в win-1251. надо либо перекодировать (причем только под windows) либо использовать только латинницу.
> При попытке скачивать ничего не происходит Как выглядит ссылка? Что пишет отладчик в браузере на вкладке network?
> Поделись ссылкой где про это написано так, что б даже я смог уловить суть. Я выше привел примеры. Если что-то непонятно, уточняй. Если кратко то надо чтобы ссылка скачивания файла закнчивалась его именем.
>>454778 Я не могу понять, что это за белый отступ справа и что с ним делать. Указывать width 100% для каждого блока? Тогда блоки будут выходить за пределы экрана. >а сайтах обычно делают середину тянущейся в ширину от и до определенного размера >У тебя ничего не тянется. А как же media правило для services? Надо как-то по другому делать?
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут:
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Простая, но полезная задача сделать список студентов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- Если ты все их решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.github.io/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git:
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.