Вы видите копию треда, сохраненную 12 апреля 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>444091
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день, не жди его, решай задачки дальше.
У нас есть уроки по основам 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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в 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 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
Мартин Фаулер. Шаблоны корпоративных приложений Patterns of Enterprise Application Architecture
Не для начинающих.
>Оно не работает с русскими символами. Что делать?
Вру, все оно там работает, проблема в другом. В массиве чекбоксов значения всегда принадлежат одним и тем же ключам, а в списке с селектами нифига не так, там в зависимости от того, сколько и какие позиции выбраны, поэтому и не совпадает.
Короче, есть какой-нибудь способ указать одной переменной "любое из значений массива" или надо через foreach делать?
Это не то. Алсо, с чекбоксами такая же ситуация. С форич работает, но если открывать форму с нуля, без предыдущего поиска, то выходят ошибки.
Уже сделал через форич, вроде все работает теперь как надо.
>Почему исплоьзуешь такой странный способ скрытия? Почему не display none?
А как иначе мне их скрывать? Мне ведь нужно, чтобы 4 разных блока были в одном и том же месте, без абсолютной позиции они будут идти друг за другом. Display none ведь не убирает их из общего потока?
>Это лучше сделать через классы. Тогда мы можем сделать несколько блоков с табами на странице.
Ты имеешь ввиду свой класс для каждого блока?
>Кроме переходов (transiotion), в CSS есть покадровая (keyframe) анимация, читал про нее? Надо хотя бы знать что это такое.
Я хотел сделать через неё, вместо transitio, но она после проигрыша возвращается в исходное положение. Я не нашел в документации как это исправить.
> Display none ведь не убирает их из общего потока?
убирает. Это visibility hidden не убирает.
> Ты имеешь ввиду свой класс для каждого блока
Вмето #tab-1 сделать .tab-1
А, хотя в случае если мы уберем id, мы не сможем связать label и input. Если нет вариантов как убрать id, можешь их оставить.
С id неудобно добавлять несколько блоков с табами, так как ты должен придумывать уникальные id и дописывать их в CSS. БЫло бы хорошо конечно чтобы все это само работало, но я сомневаюсь что это возможно.
Есть еще такая статья про верстку табов,там интересный подход: http://chikuyonok.ru/2009/04/dl-tabs/
Гугл говорит что есть свойство
animation-fill-mode:forwards
оно не поможет? Ну и в твоем случае конечно переходы больше подходят.
Да, вроде оно. Но мне все равно transition больше нравится, оно как-то удобней.
Еще помни что добавление или убирание display none убирает переходы. Потому для анимации оно может не подойти. Я тебе скидывал статью, там использовался интересный хак с max-height для скрытия элементов. Не факт конечно что он тебе подойдет.
И почитай статью (хотя бы примеры посмотри), там за счет простых переходов довольно сложные анимации делают:
http://css3.bradshawenterprises.com/transitions/
http://css3.bradshawenterprises.com/animations/
http://css3.bradshawenterprises.com/cfimg/
> нормально исправил, или это на костыль похоже?
Не нормально. Ты мог бы поменять <= на < а вместо этого нагородмл переменных. А еще лучше, использовать foreach
рнр
Если у кого-то есть интересные статьи и публикации (видео) по PHP
Поделитесь пожалуйста.
То что на хабре - 90% мутная херня.
(Интересует реализация каких-нибудь алгоритмов, возможно решение каких-то задач и прочее)
Вот смотрите я начитался
http://www.phpinfo.su/articles/practice/shablony_v_php.html
Пишу:
<?php
$a = isset($_GET['a']) && is_numeric($_GET['a']) ? $_GET['a'] : 10;
$b = isset($_GET['b']) && is_numeric($_GET['b']) ? $_GET['b'] : 20;
$result = $a + $b;
include('template.html');
?>
в этой же директории лежит templates.html у которого в body:
<?php if ($result): ?>
<span style="color:blue; font-weight:bold">Результат: <?=$result?></span>
<? else: ?>
<span style="color:red; font-weight:bold">Результат равен нулю</span>
<? endif; ?>
Я вызываю php файл , выдает пустое бело окно , вызываю шаблон , выдает слово результат без самых цифр. где я дурак?
Спасибо
Есть 2 варианта.
- вкладывать дочерние внутрь родителя:
<li>
текст
<ul>
<li>дочерний коммент</li>
...
- ставить классы или добавлять отступы через атрибут style
<div class="comment-level-1"> ...</div>
<div class="comment-level-2"> ...</div>
<div class="comment-level-3"> ...</div>
Второе сделать легче, а в первом легче скрывать/ракрывать ветки например.
Как правильно написать функцию которая принимает колбек?
Например, как надо написать мою функцию чтобы она вернула массив с нулем?
http://ideone.com/JbFbD9
Я никак не могу нагуглить.
Спасибо.
Но тут проблема с записью комментов пока, лол. Короче, суть такова: на страничке вызывается инклюдом форма для добавления коммента, откуда через POST данные передаются в action.php, который, собственно, и добавляет коммент в базу и через header("Location: /page.php?id="); переходит опять на первоначальную страничку.
Во-первых, не могу понять, как передать родительский айди (то есть к какой страничке относится коммент). В форму вставить какой-нибудь неотображаемый элемент, приравненый этому айди или как-то проще это делается? И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает.
>И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает.
Я тупой, все там работает. Но с первым вопросом по-прежнему непонятно.
Сделал вот так. С max-height хаком полная херня получается(пикрелейтед), он ведь не убирает блоки из общего потока, а это опять возвращает нас к использованию абсолютного позиционирования.
Вот хочется иногда совета, а не у кого спросить.
ОПа на всех не хватает, да и он занимается в основном с новичками по своему задачкнику.
Мне бы вот хотелось проконсультироваться по проектированию БД.
У меня есть табличка с товарами, которые могут входить в комплекс товаров - ну там набор посуды, в него входит тарелка-кружка. Соответственно имеем:
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 для второго.
Есть вариант через джойны добиться того же результата?
Так просто SELECT * FROM prod WHERE prod.p_id = 0;
Это будут либо комплекты, либо товары вне комплектов, не?
> С max-height хаком полная херня получается(пикрелейтед), он ведь не убирает блоки из общего потока
Пусть не убирает. Если у блока нулевая высота то он ведь все равно ни на что не влияет?
У тебя на картинке просто padding/border/margin не убраны (неужели ты этого не видишь?). Надо либо обнулять их, либо засунуть блок внутрь обертки на которой мы ставим overflow hidden и max-height 0, тем самым полностью скрывая содержимое.
Мне кажется ты все пытаешься намекнуть что сделать анимацию невозможно? Хорошо, смотри пикрелейтед, я ради этого научился даже скринкасты записывать.
Там конечно много недостатков: анимирована сама вкладка, а не текст в ней, паддингов нет, но это мелочи которые решаемы.
Допустим, нужно создать базу книг, где одну книгу может написать коллектив авторов, и у одного автора много книг.
Кажется, нужно сначала заинсертить в таблицу книг ее название и др.свойства, потом автора в его таблицу (если его там еще нет), а потом уже каким-то непонятным образом вынуть эти два айдишника и поставить их в результирующую таблицу.
Ей-богу, очень неудобно так учиться. Пошел на гугл, полчаса листал какие-то левые статьи. Или вообще не по теме, или непонятно, или не совсем то.
...
Вот нашел на каком-то мертвом форуме запись от 2002 года, что используется какая-то системная переменная @@identity, которая выхватывает последнюю запись, над которой проводилась операция:
SELECT @@identity as ID
А, нет, это вообще по серверу MSSql.
...
Вот есть метод PDO::lastInsertId, он возвращает айди последней записи. Так, поправьте если неправильно. Попробую родить:
$bookName = $_POST['book'];
$authorName = $_POST['author'];
$db = new PDO($dsn, $user, $pass);
$sql = "INSERT INTO book (name) VALUE (?)";
$sth = $db->prepare($sql);
$sth->bindParam('s', $bookName);
$sth->execute();
$lastBookID = $db->lastInsertId();
$sql = "INSERT INTO author (name) VALUE (?)";
$sth = $db->prepare($sql);
$sth->bindParam('s', $authorName);
$sth->execute();
$lastAuthorID = $db->lastInsertId();
$sql = "INSERT INTO book_author (book_id, author_id) VALUE (?, ?)";
$sth = $db->prepare($sql);
$sth->bindParam('ii', $bookName, $authorName);
$sth->execute();
Допустим, нужно создать базу книг, где одну книгу может написать коллектив авторов, и у одного автора много книг.
Кажется, нужно сначала заинсертить в таблицу книг ее название и др.свойства, потом автора в его таблицу (если его там еще нет), а потом уже каким-то непонятным образом вынуть эти два айдишника и поставить их в результирующую таблицу.
Ей-богу, очень неудобно так учиться. Пошел на гугл, полчаса листал какие-то левые статьи. Или вообще не по теме, или непонятно, или не совсем то.
...
Вот нашел на каком-то мертвом форуме запись от 2002 года, что используется какая-то системная переменная @@identity, которая выхватывает последнюю запись, над которой проводилась операция:
SELECT @@identity as ID
А, нет, это вообще по серверу MSSql.
...
Вот есть метод PDO::lastInsertId, он возвращает айди последней записи. Так, поправьте если неправильно. Попробую родить:
$bookName = $_POST['book'];
$authorName = $_POST['author'];
$db = new PDO($dsn, $user, $pass);
$sql = "INSERT INTO book (name) VALUE (?)";
$sth = $db->prepare($sql);
$sth->bindParam('s', $bookName);
$sth->execute();
$lastBookID = $db->lastInsertId();
$sql = "INSERT INTO author (name) VALUE (?)";
$sth = $db->prepare($sql);
$sth->bindParam('s', $authorName);
$sth->execute();
$lastAuthorID = $db->lastInsertId();
$sql = "INSERT INTO book_author (book_id, author_id) VALUE (?, ?)";
$sth = $db->prepare($sql);
$sth->bindParam('ii', $bookName, $authorName);
$sth->execute();
>Кажется, нужно сначала заинсертить в таблицу книг ее название и др.свойства, потом автора в его таблицу (если его там еще нет),
И всё это делать внутри транзакции. А ты думал!
>а потом уже каким-то непонятным образом вынуть эти два айдишника и поставить их в результирующую таблицу.
Ой нинадо нам тут про непонятные образы, а?...
Функции для доступа к СУБД возвращают эти айдишники.
> внутри транзакции
Это как? Я использовал правильный подход, или есть другой?
Просто очень угнетает отсутствие примеров. А потом когда потужишься и начинаешь выдумывать свои способы, упрекают в велосипедостроительстве, ага.
>Функции для доступа к СУБД
Если про PDO::lastInsertId, то уже нашел.
>>449628
Фикс очевидных косяков:
$sth->bindParam('s', $bookName);
$sth->bindParam(':name', $bookName, PDO::PARAM_STR);
> если связь многие ко многим?
допустим надо вставить пост тегами.
Вставляем теги
Вставляем пост
Вставляем связь между постом и тегами
Все это в рамках транзакции чтобы при ошибке не оставалось записей (ну и вставляется быстрее внутри одной транзакции).
> используется какая-то системная переменная @@identity
Это в MSSQL, в MySQL lastInsertId() есть.
Не знаю, но ответь тогда на мой вопрос.
Транзакции
https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)
http://php.net/manual/ru/pdo.transactions.php
http://habrahabr.ru/post/238119/
http://shurshun.ru/tranzaktsii-blokirovki-urovni-izoliovannosti-tranzaktsiy-v-mysql/
Заметь что есть уровни изоляции транзакций. Можно ставить более низкий уровень ради более высокой скорости работы.
MyISAM не поддерживает транзакции, InnoDB поддерживает.
>>449629
Но я не понимаю, что такое транзакция!
Переведите с иврита, пожалуйста:
Транза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются транзакционными системами, в процессе работы которых создаётся история транзакций.
Это один запрос? Или совокупность запросов за одно соединение с базой?
>>449643
Спс. Только учти, что если не пойму что там написано, опять вернусь сюда флудить.
Включение семафоров в алфавитном порядке, выполнение всех действий, отключение семафоров в обратном порядке. Читни Таненбаума, как свободное время будет.
Я прокомментирую еще что судя по тому что ты используешь 0 вместо NULl ты не знаешь про внешние ключи. Стыдно.
Прочитай: http://denis.in.ua/foreign-keys-in-mysql.htm
http://ideone.com/aNbowR
пиздец как же это пиздато блять ебать
Поставь:
error_reporting (E_ALL | E_STRICT);
И:
set_error_handler ('php_error_handler');
Затем напиши функцию:
function php_error_handler ($errno, $errstr, $errfile, $errline, $vars) {
...
...
}
где лови все ошибки.
Транзакция это группа запросов, которые выполняются как один.
Либо все выполняются, либо ни один (это называется атомарность). Атомарность должна соблюдаться даже при неожиданном отключении питания или принудительном завершении процесса 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% не выполняются, степень соответствия требованиям, насколько мы близки к идеалу, называется уровень изоляции транзакций).
Затем, чтобы в «php_error_handler()» вызывать «throw new Exception( все параметры )», так-то!
Пришел похвастаться неграмостностью?
> Включение семафоров в алфавитном порядке,
Это средство защиты от дедлоков в некоторых случаях.
Сами семафоры это средство синхронизации потоков и к транзакциям имеют отдаленное отношение. Ты наверно пытался изобразить реализацию транзакций на основе блокировок, но это очень непрактичный способ так как у тебя одна транзакция блокирует все остальные.
Анон спросил что такое транзакция, а не просил привести неэффективный пример ее реализации.
1) Там не заданы аргументы в 41-й строке,
2) У меня обработчик ошибок состоит из одной строки:
throw new Exception ("\n\n".'['.$errno.'] '.$errstr.' ('.strtr ($errfile, '\\', '/').', '.$errline.')'."\n\n");
Оно и раньше «не работало», просто интерпретатор не печатал сообщение об ошибке. А теперь, если он что-то находит, он вызывает обработчик ошибок... почему аффтары Пыха так сделали, никто не знает.
Круто, теперь он выдаёт «Stack trace», ошибка на 64-й строке: метод «summ()» надо вызывать с параметрами.
Да, я понял. Теперь он мне вместо нотисов прям в текст программмы выдает ошибку, но вот про эту строчку не понял
throw new Exception ("\n\n".'['.$errno.'] '.$errstr.' ('.strtr ($errfile, '\\', '/').', '.$errline.')'."\n\n");
Как это то должно работать?
Ну и да, я понимаю же, что туда надо вставлять параметры.
Вот как наебал систему http://ideone.com/aNbowR
Вначале «new Exception()» создаст объект со строкой, где будет «errno», «errstr» и тому подобное. Этот жуткий синтаксис — наследие Перла. А создание нового объекта — пародия на Жаббу, типа мы тоже крутые.
Затем оператор «throw» напечатает цепочку вызовов и строку из объекта.
Параметры надо задать обязательно, раз в заголовке функции так сказано. И вызов «isset» всегда вернёт «true». До него выполнение вообще не доходило, т.к. функция и не вызывалась даже.
isset($b)) {
Там в обработчике ошибок «isset» тоже не нужен: все переменные будут заданы.
А так — всё верно.
Но куда её вствить? если я эту строчку вствляю в обработчик, то тупо фатал еррор.
>>449727
Ну тип как в прописях в первом классе.
>>449729
Не все вроде бы, переделал на !empty и он мне вообще гору инфы сдает теперь.
>>449731
do {
выкидываем 4 кубика
if (поверяем выпали ли два дабла) {
запомнили в переменную если выпали;
}
} while (пока не выпадут даблы)
http://php.net/manual/ru/control-structures.do.while.php
>Но куда её вствить? если я эту строчку вствляю в обработчик, то тупо фатал еррор.
Но ведь раньше всё работало... он же печатал цепочу вызовов, когда ошибка была.
Нет, это мне ideone репортит об ошибке, он это делает автоматом же, без всех этих handler'ов, в то время как в коде программы у меня красным выдает error, а в http://ideone.com/aNbowR пишет зелененьким что все хорошо и типа нет ошибок.
Похоже на то, что красную строку «Runtime error» тоже оператор «throw» печатает.
Здесь я ХЗ, я не использую «catch» в скриптах на Пыхе. Он у меня сразу останавливается и печатает цепочку вызовов, а дальше я нахожу строку в нортонкоммандере и руками исправляю её.
Вся суть питонодебилов
Если пилить свистеперделки, то не нужен. В продакшене же пригодится, так как часто используется для хранения различных конфигов. Ну и некоторые апи его используют для респонсов.
http://ideone.com/JbFbD9
Правильно ли я применяю статические методы?
Как правильно написать функцию чтобы можно было добавлять заранее неизвестное количество объектов? В мануалах к какой-нибудь функции это обычно пишут так: [, array $... ]
Почему мне не удалось умножить, с помощью анонимной функции, таким образом return $o->type 2;
В мануале по array_map есть пример где анонимная функция возвращает return($n $n * $n);
http://php.net/manual/ru/function.array-map.php
Ну например если у нас 5 категорий товара с айди 1-5 и мы по ошибке указываем айди 7, которого нет.
Индекс на внешних ключах автоматически не создается? Или это тоже зависит от движка mysql?
>>449470
Сбрасывать значения яваскриптом либо вместо кнопки сделать ссылку «очистить фильтр».
>>449475
Не понял, но скорее всего проблема в твоем коде.
>>449476
Смотря для чего. Знание яваскрипта != знанию ноды.
На PHP есть много готовых CMS, где можно вообще обойтись без программирования. Если у тебя цель сделать как можно проще и быстрее то они тебе подойдут.
>>449477
Объясни понятно что тебе нужно. Я даже не понимаю что значит «указать переменной»? В переменную можно только сохранить какое-то значение и все.
>>449482
Потому что у тебя код неправильный.
>>449506
Payoneer это система оплаты, один из вариантов используемых одеском.
Карточка один из способов вывести деньги и насколько я знаю, там довольно неприятная комиссия получается.
>>449470
Сбрасывать значения яваскриптом либо вместо кнопки сделать ссылку «очистить фильтр».
>>449475
Не понял, но скорее всего проблема в твоем коде.
>>449476
Смотря для чего. Знание яваскрипта != знанию ноды.
На PHP есть много готовых CMS, где можно вообще обойтись без программирования. Если у тебя цель сделать как можно проще и быстрее то они тебе подойдут.
>>449477
Объясни понятно что тебе нужно. Я даже не понимаю что значит «указать переменной»? В переменную можно только сохранить какое-то значение и все.
>>449482
Потому что у тебя код неправильный.
>>449506
Payoneer это система оплаты, один из вариантов используемых одеском.
Карточка один из способов вывести деньги и насколько я знаю, там довольно неприятная комиссия получается.
>Потому что у тебя код неправильный.
Уже сам все сделал. Видимо, не стоит сразу писать сюда при каждой проблеме.
> Интересует реализация каких-нибудь алгоритмов, возможно решение каких-то задач
Это надо не видео, а книжки по структурам данным и алгоритмам читать.
>>449531
Что в адресной строке браузера? Как именно ты «вызываешь» php файл?
>>449548
Вроде пока правильно, ты же пишешь аналог array_filter? Я бы исплоьзовал слово filter в названии так как это общепринятое название такой функции и проще догадаться что она делает.
Ну и еще, тебе надо будет проверить все возможные способы передать коллбек, а именно:
- имя функции или статического метода строкой
- имя метода или статического метода массивом
- анонимная функция (это ты сделал)
- объект реализующий магический метод invoke
Надо проверить что все эти вещи передаются и вызываются.
> Интересует реализация каких-нибудь алгоритмов, возможно решение каких-то задач
Это надо не видео, а книжки по структурам данным и алгоритмам читать.
>>449531
Что в адресной строке браузера? Как именно ты «вызываешь» php файл?
>>449548
Вроде пока правильно, ты же пишешь аналог array_filter? Я бы исплоьзовал слово filter в названии так как это общепринятое название такой функции и проще догадаться что она делает.
Ну и еще, тебе надо будет проверить все возможные способы передать коллбек, а именно:
- имя функции или статического метода строкой
- имя метода или статического метода массивом
- анонимная функция (это ты сделал)
- объект реализующий магический метод invoke
Надо проверить что все эти вещи передаются и вызываются.
> как передать родительский айди (то есть к какой страничке относится коммент)
input type=hidden
> вставить какой-нибудь неотображаемый элемент, приравненый этому айди
да
> И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает.
Работает. Покажи неработающий код. И сразу второй вопрос, а в echo "id="; как подставить id ты знаешь?
>>449555
да
>>449557
Смотря что для тебя успех. Я бы не сказал что программисты особо успешные люди, если не брать Дурова, Билл Гейтса и других известных личностей. Ну и заниматься и изучать придется много.
>>449559
Иногда используется. На нем могут быть построены API, магазины свои прайс-листы в нем передают часто, так что знать XML и методы работы с ним (и XPath конечно) может быть полезно.
Я не раз с ним сталкивался.
>>449566
Не знаю, попробуй погуглить, а оценить живость общения можно например по числу тем за последний месяц и числу комментариев.
> как передать родительский айди (то есть к какой страничке относится коммент)
input type=hidden
> вставить какой-нибудь неотображаемый элемент, приравненый этому айди
да
> И второе - собственно в header("Location: /page.php?id="); как-то можно вставить айди? Конкатенация не работает.
Работает. Покажи неработающий код. И сразу второй вопрос, а в echo "id="; как подставить id ты знаешь?
>>449555
да
>>449557
Смотря что для тебя успех. Я бы не сказал что программисты особо успешные люди, если не брать Дурова, Билл Гейтса и других известных личностей. Ну и заниматься и изучать придется много.
>>449559
Иногда используется. На нем могут быть построены API, магазины свои прайс-листы в нем передают часто, так что знать XML и методы работы с ним (и XPath конечно) может быть полезно.
Я не раз с ним сталкивался.
>>449566
Не знаю, попробуй погуглить, а оценить живость общения можно например по числу тем за последний месяц и числу комментариев.
>>449572
Первый же коммент с хабра:
> Такое ощущение, что сейчас это тред – учиться проходить собеседования, а не программировать. Знать ответы на вопросы собеседования, но не применить их на практике ни разу.
> Я видел собеседования, где программисты не могли сказать, чем отличается объект от класса, процедурный подход от объектно-ориентированного. Вот, что важно.
Бессмысленно заучивать ответы на вопросы так как тебе скорее всего попадутся другие вопросы (если только это не совсем плохонькая компаняи которая даже свои вопросы придумать не может, а берет их из сети). Лучше понимать как что работает и для чего нужно.
Ну и вопросы странные.
> Что такое конструктор?
По моему любой, изучавший ООП знает этот ответ. А не изучавший вряд ли пройдет собеседование.
А так, в принципе почитать книжку может быть и полезно чтобы обнаружить что ты чего-то не знаешь и исправить пробелы. В этом плане она может пригодиться.
Ну и у меня тоже есть сборник задачек с собеседований. Собрано из постов анонов, если вы можете чем-то дополнить, присылайте мне задачки. Вот ссылка: https://github.com/codedokode/pasta/blob/master/interview-tasks.md
это чушь:
> Что работает быстрее: преинкремент или постинкремент?
> Преинкремент быстрее, т.к. постинкремент создает временную переменную, в то время как преинкремент изменяет саму переменную непосредственно.
такие утверждения должны подтвержаться ссылкой на исходники php. Или хотя бы измерениями. Если бы я собеседовал человека и он такое сказал, я бы попросил чемм это подтверждается. «прочитал в интернете» разумеется не ответ :) Если бы мне задали такой вопрос, я бы сказал что не знаю, и надо сделать измерения, но интуиция подсказввает что разница если и есть то очень маленькая.
> В двойных кавычках данные “парсятся”
Это называется интерполяция строк и не надо придумывать свои названия
> Нужно определить длину строки функцией strlen(). Откуда она узнает
сколько в строке символов?
Плохой вопрос. Откуда новичок знает про устройство zval? максимум что он должен знать, что длина где-то хранится и ее получение это O(1).
> Как вывести все элементы массива на экран?
echo implode
> Что такое ассоциативный массив?
> Массивы, индексами которых являются строки, называются ассоциативными.
Неверно. https://ru.wikipedia.org/wiki/%D0%90%D1%81%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2
Ассоциативный массив это массив в котором ключи могут быть любыми числами или строками (или даже другими типами, если речь не о 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 то можно столкнуться).
Ну и сомневаюсь что такой ответ поможет новичику:
> Memento (Хранитель). Паттерн поведения объектов, сохраняющий состояни
Так как после этого его попросят проиллюстрировать это кодом.
> Полиморфизм. Это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач.
Одно и то же имя?
> Что такое виртуальный метод?
Это вопрос по Си++, а не про PHP. В PHP методы не делятся на виртуальные и нет. Разумеется человек не изучавший Си++ и рассуждающий про виртуальные методы скорее всего наговорит чуши.
> Область видимости переменной – это место в программе, в котором доступно значение переменной. Каждая переменная имеет свою область видимости (есть локальные переменные и глобальные переменные)
> Public. Метод/переменная доступны из любого места в коде.
Тут путают понятия scope (область видимости переменной) и access (модификатор доступа у полей класса)
> Локальные доступны только конкретной подпрограмме, глобальные – всей программе. Ограничение зоны видимости придумали как для возможности использовать одинаковые имена переменных (что разумно, когда в разных подпрограммах переменные выполняют похожую функцию), так и для защиты от ошибок, связанных с неправомерным использованием переменных.
То же самое, бред
> . Интерфейс – такой же абстрактный класс, только в нем не может
быть свойств и не определены тела у методов.
Интерфейс это не класс. В вики https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) пишут:
> Интерфе́йс — семантическая[источник не указан 478 дней] и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом.
Мануал php ( http://php.net/manual/ru/language.oop5.interfaces.php ) говорит:
> Интерфейсы объектов позволяют создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала
> Кроме того, что абстрактный класс наследуется (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-страниц и выполнять над ними определенные действия.
Какой вопрос, такой ответ...
В общем, почитать эту книжку можно, но заучивать то, что там написано, не стоит.
>>449572
Первый же коммент с хабра:
> Такое ощущение, что сейчас это тред – учиться проходить собеседования, а не программировать. Знать ответы на вопросы собеседования, но не применить их на практике ни разу.
> Я видел собеседования, где программисты не могли сказать, чем отличается объект от класса, процедурный подход от объектно-ориентированного. Вот, что важно.
Бессмысленно заучивать ответы на вопросы так как тебе скорее всего попадутся другие вопросы (если только это не совсем плохонькая компаняи которая даже свои вопросы придумать не может, а берет их из сети). Лучше понимать как что работает и для чего нужно.
Ну и вопросы странные.
> Что такое конструктор?
По моему любой, изучавший ООП знает этот ответ. А не изучавший вряд ли пройдет собеседование.
А так, в принципе почитать книжку может быть и полезно чтобы обнаружить что ты чего-то не знаешь и исправить пробелы. В этом плане она может пригодиться.
Ну и у меня тоже есть сборник задачек с собеседований. Собрано из постов анонов, если вы можете чем-то дополнить, присылайте мне задачки. Вот ссылка: https://github.com/codedokode/pasta/blob/master/interview-tasks.md
это чушь:
> Что работает быстрее: преинкремент или постинкремент?
> Преинкремент быстрее, т.к. постинкремент создает временную переменную, в то время как преинкремент изменяет саму переменную непосредственно.
такие утверждения должны подтвержаться ссылкой на исходники php. Или хотя бы измерениями. Если бы я собеседовал человека и он такое сказал, я бы попросил чемм это подтверждается. «прочитал в интернете» разумеется не ответ :) Если бы мне задали такой вопрос, я бы сказал что не знаю, и надо сделать измерения, но интуиция подсказввает что разница если и есть то очень маленькая.
> В двойных кавычках данные “парсятся”
Это называется интерполяция строк и не надо придумывать свои названия
> Нужно определить длину строки функцией strlen(). Откуда она узнает
сколько в строке символов?
Плохой вопрос. Откуда новичок знает про устройство zval? максимум что он должен знать, что длина где-то хранится и ее получение это O(1).
> Как вывести все элементы массива на экран?
echo implode
> Что такое ассоциативный массив?
> Массивы, индексами которых являются строки, называются ассоциативными.
Неверно. https://ru.wikipedia.org/wiki/%D0%90%D1%81%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2
Ассоциативный массив это массив в котором ключи могут быть любыми числами или строками (или даже другими типами, если речь не о 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 то можно столкнуться).
Ну и сомневаюсь что такой ответ поможет новичику:
> Memento (Хранитель). Паттерн поведения объектов, сохраняющий состояни
Так как после этого его попросят проиллюстрировать это кодом.
> Полиморфизм. Это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач.
Одно и то же имя?
> Что такое виртуальный метод?
Это вопрос по Си++, а не про PHP. В PHP методы не делятся на виртуальные и нет. Разумеется человек не изучавший Си++ и рассуждающий про виртуальные методы скорее всего наговорит чуши.
> Область видимости переменной – это место в программе, в котором доступно значение переменной. Каждая переменная имеет свою область видимости (есть локальные переменные и глобальные переменные)
> Public. Метод/переменная доступны из любого места в коде.
Тут путают понятия scope (область видимости переменной) и access (модификатор доступа у полей класса)
> Локальные доступны только конкретной подпрограмме, глобальные – всей программе. Ограничение зоны видимости придумали как для возможности использовать одинаковые имена переменных (что разумно, когда в разных подпрограммах переменные выполняют похожую функцию), так и для защиты от ошибок, связанных с неправомерным использованием переменных.
То же самое, бред
> . Интерфейс – такой же абстрактный класс, только в нем не может
быть свойств и не определены тела у методов.
Интерфейс это не класс. В вики https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) пишут:
> Интерфе́йс — семантическая[источник не указан 478 дней] и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом.
Мануал php ( http://php.net/manual/ru/language.oop5.interfaces.php ) говорит:
> Интерфейсы объектов позволяют создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала
> Кроме того, что абстрактный класс наследуется (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-страниц и выполнять над ними определенные действия.
Какой вопрос, такой ответ...
В общем, почитать эту книжку можно, но заучивать то, что там написано, не стоит.
> HTML5 знаешь? Нарисуй что-нибудь
> <rect x=”100” y=”100” width = “300” heigh
Это SVG а не HTML5
Ну и комменты на хабре жгут конечно:
> Вывести только те магазины, которые находятся во Львове и/или Харькове:
> SELECT × FROM shops WHERE area=”Львов” AND area=”Харьков
и
> что выведет на экран $i++ -$i-- × ++$j
> Оно выведет из себя программиста, поддерживающего этот говнокод.
Я советую вместо этой книги прочесть мануал php и замечательный сайт phptherigthway: http://getjump.github.io/ru-php-the-right-way/
>>449704
ideone не пишет ошибки если ты исплоьзуешь кнопку Ideone it. Надо страницу обновить чтобы их увидеть.
> почему аффтары Пыха так сделали, никто не знает.
Исторически там не было исключений (и ООП в принципе), наверно по этому. bash тоже по умолчанию при любой ошибке как ни в чем не бывало продолжает выполнять скрипт. К счастью, set -e его лечит от этой дурной привычки. надеюсь в будущем и мы перейдем на исключения only.
>>449712
Это вообще писать не надо было, надо было на ideone страницу обнвоить. Не знаю зачем ты это сделал.
Твой код по моему неправильный от начала и до конца. Ну и непонятно зачем ты для сложения 2 чисел нагородил целый класс с обработчиком ошибок.
> Этот жуткий синтаксис — наследие Перла.
Это удобный синтаксис, который не так давно портировали в яваскрипт ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings ), который есть в Руби и которого нет в Питоне, Java и других языках.
> А создание нового объекта — пародия на Жаббу
ООП не в Java придумали. И ООП и исключения были и раньше, например в Си++.
> Затем оператор «throw» напечатает цепочку вызовов и строку из объекта.
Он лишь выкидывает исключение и ничего не печатает.
>>449742
> если я эту строчку вствляю в обработчик, то тупо фатал еррор.
Ну так исправь код.
>>449758
ideone не всегда показывает ошибки, надо обновить страницу.
>>449769
Я тебе могу посоветовать главу по ООП в моем учебнике (ссылка в ОП посте). Там все понятно объясняется и есть хорошие задачи, которые я могу проверить. Ну и там не придется писать эти странные конструкции, которые ты пишешь потому что я вижу что ты совсем ничего не понимаешь.
А если тебя интересуют исключения, у меня есть урок и про них: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
>>449704
ideone не пишет ошибки если ты исплоьзуешь кнопку Ideone it. Надо страницу обновить чтобы их увидеть.
> почему аффтары Пыха так сделали, никто не знает.
Исторически там не было исключений (и ООП в принципе), наверно по этому. bash тоже по умолчанию при любой ошибке как ни в чем не бывало продолжает выполнять скрипт. К счастью, set -e его лечит от этой дурной привычки. надеюсь в будущем и мы перейдем на исключения only.
>>449712
Это вообще писать не надо было, надо было на ideone страницу обнвоить. Не знаю зачем ты это сделал.
Твой код по моему неправильный от начала и до конца. Ну и непонятно зачем ты для сложения 2 чисел нагородил целый класс с обработчиком ошибок.
> Этот жуткий синтаксис — наследие Перла.
Это удобный синтаксис, который не так давно портировали в яваскрипт ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings ), который есть в Руби и которого нет в Питоне, Java и других языках.
> А создание нового объекта — пародия на Жаббу
ООП не в Java придумали. И ООП и исключения были и раньше, например в Си++.
> Затем оператор «throw» напечатает цепочку вызовов и строку из объекта.
Он лишь выкидывает исключение и ничего не печатает.
>>449742
> если я эту строчку вствляю в обработчик, то тупо фатал еррор.
Ну так исправь код.
>>449758
ideone не всегда показывает ошибки, надо обновить страницу.
>>449769
Я тебе могу посоветовать главу по ООП в моем учебнике (ссылка в ОП посте). Там все понятно объясняется и есть хорошие задачи, которые я могу проверить. Ну и там не придется писать эти странные конструкции, которые ты пишешь потому что я вижу что ты совсем ничего не понимаешь.
А если тебя интересуют исключения, у меня есть урок и про них: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> Мне нужно гостевуху самописную для практики завернуть в ООП.
У нас есть хорошее задание сделать список студентов с подробными комментариями и разъяснениями. И опять же, я готов его проверить и например сказать где ошибки: https://github.com/codedokode/pasta/blob/master/student-list.md
>>449782
Яндекс маркет его использует например. так что скорее всего пригодится.
>>449797
> Правильно ли я применяю статические методы?
Не вижу ни одного статического метода.
> Как правильно написать функцию чтобы можно было добавлять заранее неизвестное количество объектов?
RTFM
http://php.net/manual/ru/functions.arguments.php#functions.variable-arg-list
http://php.net/manual/ru/functions.arguments.php#functions.variable-arg-list.old
> Почему мне не удалось умножить, с помощью анонимной функции, таким образом return $o->type 2;
покажи код телепаты в отпуске
>>449800
> 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 всегда возвращает новый массив не изменяя старый. А ты возвращаешь тот же самый объект.
> Мне нужно гостевуху самописную для практики завернуть в ООП.
У нас есть хорошее задание сделать список студентов с подробными комментариями и разъяснениями. И опять же, я готов его проверить и например сказать где ошибки: https://github.com/codedokode/pasta/blob/master/student-list.md
>>449782
Яндекс маркет его использует например. так что скорее всего пригодится.
>>449797
> Правильно ли я применяю статические методы?
Не вижу ни одного статического метода.
> Как правильно написать функцию чтобы можно было добавлять заранее неизвестное количество объектов?
RTFM
http://php.net/manual/ru/functions.arguments.php#functions.variable-arg-list
http://php.net/manual/ru/functions.arguments.php#functions.variable-arg-list.old
> Почему мне не удалось умножить, с помощью анонимной функции, таким образом return $o->type 2;
покажи код телепаты в отпуске
>>449800
> 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.
Также есть статья http://denis.in.ua/foreign-keys-in-mysql.htm
мануал http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html
> 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.
Мне это понравилось.
>Просто прохождение собеседования часто зависит не от навыков программирования, а от социальных навыков. Тебя могут завернуть, если ты, там, вяло руку рекрутеру пожал, или смело в глаза не смотрел.
Или задаются пространные вопросы типа чем отличается php 5.3 от php 5.2.
Все так, меня один раз спросили зачем нужен HTML, я был немного ошарашен, и ответил какими-то общими словами. После этого я начал готовиться к собеседованиям тщательней, потому что, как оказалось, код, который я писал за время обучения, собеседователей не очень интересует.
Все правильно делаю? хотя в таких задачах вряд ли можно запороть что либо
http://ideone.com/ANPFfd
Название функции - глагол, действие над чем-либо.
Название класса - существительное, обобщенное определение для порождаемых объектов.
А интерфейс как называть? Также как класс? Как-то непрозрачно получается. Ведь это не Человек, Собака, Пользователь, а набор функций.
Ну почему же, вот у тебя год растет с каждой итерацией цикла, ты можешь сделать так, что бы и курс доллара рос например вместе с ней, или рандомить изменение курса внутри цикла скажем.
Товар, не входящий в комплекты тоже будет p_id = 0. А нужны комплекты и товары не в комплектах отдельно
{
protected function fly():
}
class Plane implements Flyable
{
protected function fly()
{
//
}
}
Пишу код, который работает с апи твитч.тв.
Что мне нужно? Нужно, чтобы пользователь писал свой ник в поле и дальше скрипт (либо дописывал вокруг этого ника шаблон из кода , либо добавлял его в массив $channels = array, а потом дописывал код шаблона для каждого ника измассива)
Собственно я почти все написал, но нужно только вот эту подстановку сделать.
Не знаю, поняли ли вы меня.
http://ideone.com/e.js/Y6ANL4
Конкретно как слепить
fwrite($_file, "$channels = array(".$_inkey.") ;"); и код отображения стрима, конкретно нужно всунуть это говно в массив.
Или же сделать fwrite($_file, "вписать сюда весь шаблон отображения") чтобы после вписки ника, появлялся еще один кусок шалона, только уже с введеным ником.
На packagist.org есть строки, которые нужно прописывать в require для подключения зависимостей.
"yiisoft/yii": "1.1.16" - для первого yii, например.
он закинется в вендор, мне его вынимать от туда или как с ним работать?
Короче я тупая дрянь, не знающая пхп.
Все делается в 10 раз проще через фаил-массив.
file("list.txt"); открываем фаил. file сразу открывает, как массив.
Сохраняет все, что отправляют юзвери с поля inkey на странице.
$_file = fopen('list.txt', 'a');
fwrite($_file, "" .$_inkey.",");
fclose($_file);
Как я понимаю, namespace и use являются неотъемлемой частью ООП парадигмы в PHP.
Как относиться к людям, которые вообще их не используют в 2015 году? Сам я совсем нюфаг в PHP, потому и интересуюсь.
Спросить у них, как они пользуютсяавтозагрузкой классов.
Сделай поиск по файлам в проекте. Ищи имя этого файла.
Что бы обмениваться данными в интернетах инбифо: ты путаешь с http, сучечка, вот зачем. Это язык разметки и на нем пишется каркас сайтов и страничек. Плюс он стандартизирован и его понимают все браузеры. Я ответил на вопрос? не гугля
Ну ты сделал что у тебя курс тупо рандомится каждый раз, а это не очень. Ты сделай что бы у тебя рандомилось некое изменение этого курса. Пусть может быть какы отрицательным, так и положительным. Пусть так же будет не целым числом рублей, а скажем с долями до 0.1, ну например за год курс изменился на 0.1 рубля, или на -1.5 рубля, ок? Пусть будет например маленький шанс словить обвал рубля который сразу поднимает курс доллара в два раза!
Пусть у тебя еще выводится к твоим данным дополнительно курс доллара, а так же его изменения.
Что бы изменения были типа:
1-й год:
изменение курса: 0
курс доллара 60 рублей
2-й год:
изменение курса: 0.1
курс доллана 60.1 рублей
3-й год:
изменение курса: -1.5
курс доллара 58.6 рублей, и так далее и посмотрим куда доллар ускачет в итоге за 100 лет.
4-й год:
изменение курса: дефолт
НЕ БУ ДЕТ... говорили они, скупая доллар по 117.2 рублей
5-й год
....
последний год.
Кек, ночью займусь. Думал о том как сделать рандомным курс, но у меня не срослось допустим к какому либо значению mt_rand присвоить свой курс. Допстим прописать рандомизацию от 1го до 6ти и каждой присвоить курс. Япытался, но короче вскипел и сделал так.
{
5555: {
first: "5555",
second: "secondtext",
}
}
Как мне сделать foreach только ПРОПУСТИВ вервое вложение, а именно 5555 и сразу начинать с first
>но у меня не срослось допустим к какому либо значению mt_rand присвоить свой курс.
Я не понял ничего из этого, но скажу тебе вот что:
mt_rand - это функция, которая тебе всего лишь возвращает значение, в зависимости от параметров которые ты ей передал.
ну тип если ты ей передал 1 и 5, то вернет тебе случайное число от 1 до 5, что бы это число зафиксировать, тебе нужно сохранить это в переменную:
$var = mt_rand(1,5);
Ну это ты я думаю и сам понял.
Ты просто рандомь колебания курса для начала. И эти колебания накладывай на текущий курс? Это понятно как сделать для начала? Понимаешь так же как сделать так, что бы у тебя рандомились не целые числа, а скажем с 1 знаком после запятой?
>> Почему мне не удалось умножить, с помощью анонимной функции, таким образом 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);
Второй будет изменять изменять значения.
>> Почему мне не удалось умножить, с помощью анонимной функции, таким образом 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);
Второй будет изменять изменять значения.
Зачем вынимать, все зависимости у тебя будут в вендоре. Подключаешь их в index.php используя созданный композером автолоадер. Так же отдельно подключаешь Yii.
http://www.yiiframework.com/doc-2.0/guide-structure-entry-scripts.html
Тут можешь посмотреть, если не понятно, актуально для первого Yii.
> как же они отображаются в фотошопе?
Фотошоп вместе с текстом сохраняет его скриншот картинкой.Но отредактировать такой текст не получится.
> есть какой-то способ их вытащить оттуда, кроме как каждый слой отдельно вытаскивать в новый холст и сохранять отдельным файлом?
Ты должен научиться «нарезать» макет. Есть разные способы. Знание горячих клавиш поможет сильно ускорить работу.
Во-первых ты должен освоить все кнопки и инструменты в диалоге File -> Save for Web (Ctrl + Alt + Shift + S). Им ты можешь подобрать оптимальный формат и настройки картинки при сохранении. Разумеется прежде чем им пользоваться ты должен выучить особенности и преимущества разных форматов графики: JPG, GIF, PNG8, PNG24, SVG.
http://rugraphics.ru/photoshop/sohranyaem-izobrazhenie-dlya-web
http://www.adobeps.ru/photoshop-lessons/56-modul-save-for-web.html (статья по моему немного старая, в том что касается разрешения экрана)
Далее, есть слайсы — ты можешь разметить страницу на кусочки и сохранить их сразу:
http://iloveicons.ru/blog/2010/11/19/slice-tool-i-eshhyo-nemnogo-o-photoshop/
http://www.foxter.ru/showthread.php?t=2367
http://habrahabr.ru/post/45948/
Я не помню точно, но по моему слайсы сохраняются вместе с фоном, что не всегда желательно, иногда нам нужна картинка на прозрачном фоне. В этом случае придется вырезать вручную.
Вырезаешь так: выделаешь прямоугольник и далее жмешь либо 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 — прямоугольники.
В общем, советую изучить инструменты и горячие клавиши — поможет сэкономить время.
> как же они отображаются в фотошопе?
Фотошоп вместе с текстом сохраняет его скриншот картинкой.Но отредактировать такой текст не получится.
> есть какой-то способ их вытащить оттуда, кроме как каждый слой отдельно вытаскивать в новый холст и сохранять отдельным файлом?
Ты должен научиться «нарезать» макет. Есть разные способы. Знание горячих клавиш поможет сильно ускорить работу.
Во-первых ты должен освоить все кнопки и инструменты в диалоге File -> Save for Web (Ctrl + Alt + Shift + S). Им ты можешь подобрать оптимальный формат и настройки картинки при сохранении. Разумеется прежде чем им пользоваться ты должен выучить особенности и преимущества разных форматов графики: JPG, GIF, PNG8, PNG24, SVG.
http://rugraphics.ru/photoshop/sohranyaem-izobrazhenie-dlya-web
http://www.adobeps.ru/photoshop-lessons/56-modul-save-for-web.html (статья по моему немного старая, в том что касается разрешения экрана)
Далее, есть слайсы — ты можешь разметить страницу на кусочки и сохранить их сразу:
http://iloveicons.ru/blog/2010/11/19/slice-tool-i-eshhyo-nemnogo-o-photoshop/
http://www.foxter.ru/showthread.php?t=2367
http://habrahabr.ru/post/45948/
Я не помню точно, но по моему слайсы сохраняются вместе с фоном, что не всегда желательно, иногда нам нужна картинка на прозрачном фоне. В этом случае придется вырезать вручную.
Вырезаешь так: выделаешь прямоугольник и далее жмешь либо 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 — прямоугольники.
В общем, советую изучить инструменты и горячие клавиши — поможет сэкономить время.
ОП, пока ты тут, скажи мне, что фокусить для будущей работы в бэкэнде? Фреймворки, MySQL, пыха\руби\питон, это всё, или еще чего нужно?
Я ж ньюфаг, но идея была в принципе вот такая, когда пытался с курсом играться.
$cource = mt_rand(1,6);
If(mt_rand == 1) {
$cource = 58;
}
elseif(/////){
}
И так по всем пунктам, но выходит что он курсу приваивал знаение от 1го до 6.
И все же, где мне взять эти шрифты? Разве не должны они идти вместе с макетом? Я даже название их посмотреть не могу.
Не работает.
Вот массив - http://goo.gl/6TdnfJ
И мне нужно rofeach массив исклив первое значение {
1644: его нужно игнорировать, а сам массив должен читаться с
{
key: "",
premium: "true",
Ну и перед нарезкой я советую рисовать на бумаге схему, как будут расположены блоки, выписать шрифты, размеры и цвета — потом при верстке смотреть их на бумаге удобнее чем лезть в фотошоп и мерять.
А, еще по моему, если картинка в отдельном слое с прозрачностью, можно выделить ее нажав в окне слоев на слой с клавишей Ctrl. Или двойным кликом? Не помню.
А, вот еще совет как делать бесшовные текстуры (например для фона): http://www.photoshop-master.ru/lessons.php?rub=28&id=760
Вот статьи про оптимизацию картинок. Тебе не требуется пока это делать, но прочитай чтобы иметь представление что вообще возможно:
http://chikuyonok.ru/2009/05/sprites-1/
http://www.artlebedev.ru/tools/technogrette/img/png-1/
http://www.artlebedev.ru/tools/technogrette/img/jpeg-1/
http://chikuyonok.ru/2011/08/optimize-with-canvas/
https://web.archive.org/web/20140701143104/http://chikuyonok.ru/2009/03/photoshop-for-webdevs-3/
https://web.archive.org/web/20140701163530/http://chikuyonok.ru/2009/04/photoshop-for-webdevs-4/
https://web.archive.org/web/20140702182126/http://chikuyonok.ru/2009/04/photoshop-for-webdevs-5/
https://web.archive.org/web/20140701133745/http://chikuyonok.ru/2009/03/photoshop-for-webdevs-2/ (сейчас это наверно на CSS3 проще сделать, но сама идея актуальна)
Я могу рассказать еще про один трюк, который я сам применял. Допустим у нас есть большая фотография с небольшой надписью (или любым другим контрастным мелкодетальным изображением) на ней. С одной стороны, картинка хорошо жмется JPG, но при этом текст мылится. А PNG идеально передает все, но картинка весит много. В этом случае уместно может быть разрезать картинку на 2 части: фон который мы жмем JPG и надпись сжатая в PNG.
Ты конечно тут мог бы сказать что ты вообще-то php изучаешь, но я бы советовал не ограничивать свой кругозор. Мне например умение пользоваться фотошопом пригодилось. Тем более я же не говорю что от тебя требуется тратить по 2 часа на каждую картинку, просто почитай чтобы знать что вообще можно сделать.
Ну и перед нарезкой я советую рисовать на бумаге схему, как будут расположены блоки, выписать шрифты, размеры и цвета — потом при верстке смотреть их на бумаге удобнее чем лезть в фотошоп и мерять.
А, еще по моему, если картинка в отдельном слое с прозрачностью, можно выделить ее нажав в окне слоев на слой с клавишей Ctrl. Или двойным кликом? Не помню.
А, вот еще совет как делать бесшовные текстуры (например для фона): http://www.photoshop-master.ru/lessons.php?rub=28&id=760
Вот статьи про оптимизацию картинок. Тебе не требуется пока это делать, но прочитай чтобы иметь представление что вообще возможно:
http://chikuyonok.ru/2009/05/sprites-1/
http://www.artlebedev.ru/tools/technogrette/img/png-1/
http://www.artlebedev.ru/tools/technogrette/img/jpeg-1/
http://chikuyonok.ru/2011/08/optimize-with-canvas/
https://web.archive.org/web/20140701143104/http://chikuyonok.ru/2009/03/photoshop-for-webdevs-3/
https://web.archive.org/web/20140701163530/http://chikuyonok.ru/2009/04/photoshop-for-webdevs-4/
https://web.archive.org/web/20140702182126/http://chikuyonok.ru/2009/04/photoshop-for-webdevs-5/
https://web.archive.org/web/20140701133745/http://chikuyonok.ru/2009/03/photoshop-for-webdevs-2/ (сейчас это наверно на CSS3 проще сделать, но сама идея актуальна)
Я могу рассказать еще про один трюк, который я сам применял. Допустим у нас есть большая фотография с небольшой надписью (или любым другим контрастным мелкодетальным изображением) на ней. С одной стороны, картинка хорошо жмется JPG, но при этом текст мылится. А PNG идеально передает все, но картинка весит много. В этом случае уместно может быть разрезать картинку на 2 части: фон который мы жмем JPG и надпись сжатая в PNG.
Ты конечно тут мог бы сказать что ты вообще-то php изучаешь, но я бы советовал не ограничивать свой кругозор. Мне например умение пользоваться фотошопом пригодилось. Тем более я же не говорю что от тебя требуется тратить по 2 часа на каждую картинку, просто почитай чтобы знать что вообще можно сделать.
Если интерфейс обозначает умение то оканчивается на -able:
Serializable, Traversable, Likeable.
Еще интерфейс может использоваться для абстракции от использования какого-то класса, в этом случае пишут так:
RequestInterface, ResponseInterface, MessageInterface
В некоторых языках (C++, C#) используют I + имя класса например IDispatcher, IRequest, в PHP так не принято.
А что ты знаешь? Вообще глубокое изучение Symfony 2 очень полезно для бекендщика (разумеется перед этим ты должен изучить ООП, MVC и DI). Также, база данных: индексы, оптимизация.
>>450082
Посмотреть название ты можешь. Выбирай Text Tool (T) щелкай на надпись и появится шрифт и размер.
Шрифты по моему скачиваются в интернете. но на компьютер тебе ставить их не обязательно. Тебе главное их подключить к странице либо через Google Fonts либо через этот конструктор http://www.fontsquirrel.com/tools/webfont-generator
Статья http://habrahabr.ru/post/138747/
http://htmlbook.ru/blog/vstraivaem-shrifty-pri-pomoshchi-font-squirrel-font-fac
font-face:
http://vremenno.net/html-css/cross-browser-font-face/
http://habrahabr.ru/post/113136/
(здесь ты можешь заметить что даже подключение шрифта все браузеры умудрились сделать по-своему и с подводными камнями. Аналогичные проблемы есть с форматами видео и аудио поддерживаемыми браузерами. Привыкай.)
Если нужные тебе шрифты платные, ты можешь заменить их на похожие бесплатные. Найти их можно например на Google Fonts.
> Разве не должны они идти вместе с макетом?
Наше задание ближе к реальному миру, а не идеальному.
> зачем нужен HTML,
А вопрос-то неплохой, проверяет понимаешь ли ты как устроен веб или нет. Не знаю, для чего он нужен, но HTML создан для верстки веб-страниц, которые затем отображаются в браузере. Самый первый браузер (mosaic) использовал HTML.
>>449888
Все верно.
>>449894
УмеющийХодить (Walkable), УмеющийПрыгать (Jumpable?). Также если интерфейс представляет не умение, а объект, управляющий машиной то ИнтерфейсВодителя (DriverInterface) например (а реализациями этого интерфейса могут быть например ЧеловекВодитель, КотВодитель и РобоВодитель).
>>449903
Тогда удобно JOIN использовать.
>>449906
Бывает еще RequestInterface или MessageInterface когда интерфейс абстрагирует не одну способность, а целый класс.
>>449915
> -webkit-transition:color 1.5s;
Что-то в моем фаерфоксе не работает. Сделай для всех поддерживающих браузеров:
http://caniuse.com/#search=transition
http://css3.bradshawenterprises.com/which-vendor-prefixes-are-needed/
Я также добавлю что вендорные префиксы начали использовать несколько лет назад по той причине что браузеры внедряли поддержку новых фич до оформления стандарта, и префиксы предназначались для любителей поэкспериментировать (а не для верстки). Но вместо этого верстальщики начали массово их использовать в верстке, причем часто они ставили префикс для одного браузера и не ставили для другого (прямо как ты). Эта практика была признана дурной и теперь экспериментальные фичи надо включать в настройках браузера, по умолчанию они не доступны. Но вендорные префиксы стоит по-прежнему ставить для более старых браузеров.
> зачем нужен HTML,
А вопрос-то неплохой, проверяет понимаешь ли ты как устроен веб или нет. Не знаю, для чего он нужен, но HTML создан для верстки веб-страниц, которые затем отображаются в браузере. Самый первый браузер (mosaic) использовал HTML.
>>449888
Все верно.
>>449894
УмеющийХодить (Walkable), УмеющийПрыгать (Jumpable?). Также если интерфейс представляет не умение, а объект, управляющий машиной то ИнтерфейсВодителя (DriverInterface) например (а реализациями этого интерфейса могут быть например ЧеловекВодитель, КотВодитель и РобоВодитель).
>>449903
Тогда удобно JOIN использовать.
>>449906
Бывает еще RequestInterface или MessageInterface когда интерфейс абстрагирует не одну способность, а целый класс.
>>449915
> -webkit-transition:color 1.5s;
Что-то в моем фаерфоксе не работает. Сделай для всех поддерживающих браузеров:
http://caniuse.com/#search=transition
http://css3.bradshawenterprises.com/which-vendor-prefixes-are-needed/
Я также добавлю что вендорные префиксы начали использовать несколько лет назад по той причине что браузеры внедряли поддержку новых фич до оформления стандарта, и префиксы предназначались для любителей поэкспериментировать (а не для верстки). Но вместо этого верстальщики начали массово их использовать в верстке, причем часто они ставили префикс для одного браузера и не ставили для другого (прямо как ты). Эта практика была признана дурной и теперь экспериментальные фичи надо включать в настройках браузера, по умолчанию они не доступны. Но вендорные префиксы стоит по-прежнему ставить для более старых браузеров.
> input.tab
> label.tab{
Это плохая идея, использовать один класс для разных целей, так как создает путаницу. Лучше совместить название виджета и название элемента например:
.tabs-input {
.table-header {
Ну и для каждого инпута незачем свой класс придумывать. Можно же сделать такое правило:
.tabs > input
и сэкономить время на расстановку классов.
>>449926
Тебе надо изучить сам композер сначала:
http://habrahabr.ru/post/145946/
Установка сводится к 2 вещам:
1) создаем composer.json где пишем названия и версии библиотек (можно посмотреть на packagist)
2) выполняем php composer.phar install
>>449932
Честно говоря лапша какая-то в худших традициях php. Все смешано в кучу, никакой обработки ошибок.
> input.tab
> label.tab{
Это плохая идея, использовать один класс для разных целей, так как создает путаницу. Лучше совместить название виджета и название элемента например:
.tabs-input {
.table-header {
Ну и для каждого инпута незачем свой класс придумывать. Можно же сделать такое правило:
.tabs > input
и сэкономить время на расстановку классов.
>>449926
Тебе надо изучить сам композер сначала:
http://habrahabr.ru/post/145946/
Установка сводится к 2 вещам:
1) создаем composer.json где пишем названия и версии библиотек (можно посмотреть на packagist)
2) выполняем php composer.phar install
>>449932
Честно говоря лапша какая-то в худших традициях php. Все смешано в кучу, никакой обработки ошибок.
Лучше писать 1.~ чтобы не привязываться к конкретной версии.
>>449990
Это хороший вопрос. Важно правильно называть все сущности в программе. А те кто не хотят изучать эти правила и следовать им — редиски, и их код лучше даже не смотреть, 100% что это какая-нибудь нечитаемая лапша которую никто не поймет.
>>450005
Его не надо вынимать оттуда. Но надо подключить.
Вообще, Yii1 (в отличие от Yii2) раньше был не совсем рассчитан на работу c композером, потому придется немного помучаться. Вот тут описано как:
http://www.simplecoding.org/composer-yii-imagine-nebolshoe-prilozhenie-dlya-zagruzki-kartinok.html
Также подумай не проще ли перейти на Yii2 который новее и лучше соответствует современным подходам в разработке.
>Ну и перед нарезкой я советую рисовать на бумаге схему, как будут расположены блоки, выписать шрифты, размеры и цвета — потом при верстке смотреть их на бумаге удобнее чем лезть в фотошоп и мерять.
Охуительные истории
мимо-верстун
Сейчас сайт сделан так что трипкод постоянно теряется. Я замучался его вводить.
> у меня git внезапно начал считать конкретный .php файл бинарным.
Какая кодировка? Не utf-16 случайно?
Также пишут git может реагировать на слишком длинные строки.
Принудительно сделать файл текстовым можно через http://git-scm.com/docs/gitattributes но я бы советовал вместо этого разобраться и исправить проблему с файлом.
>>450015
fopen/fwrite заменяется на file_put_content. ты наверно по какому-то древнему учебнику учился.
Ну и плохая идея начинать переменные с подчеркивания. Некрасиво же и непонятно чем _file лучше чем file? Тем что дольше печатать или тем что хуже читается?
>>450019
да. Библиотеки и фреймворки их используют .
> Как относиться к людям, которые вообще их не используют в 2015 году?
использовать ты их не обязан, а знать обязан.
>>450031
.gitattributes если он есть.
>>450039
HTML сделан для верстки страниц (альтернативных языков для этого нет, кроме XHTML). Ну а страницы уже могут использоваться для обмена информацией.
>>450051
Анон говорит что если не генерировать каждый год курс случайно, а генерировать случайное изменение (причем с большой вероятностью изменение небольшое, но иногда случаются обвалы) то будет смотреться более реалистично.
Кстати, я не купил ни одного доллара когда курс упал первый раз на 10% (и позже тоже). Я молодец? В 2008 году кстати тоже не покупал.
>>450067
> Тогда, это нужно сделать вот так:
> $r = $o->type;
> $r = $r x 2;
> return $r
> Верно?
да
> Но как это применить к определенному параметру? Передавать изначально в функцию?
Прописать в функции все что надо.
> Не могу сообразить. Подскажи плиз.
$result = array_map(function ($x) { return pow($x, 2); }, range(1, 10));
var_dump($result); // 1 , 4, 9, 16 ...
> Эм... Я не припоминаю такого. Помню что ты говорил что можно передавать сразу функцией
Значит не тебе говорил
> а вот что бы я передавал выражение когда-либо, за исключением этого случая - я не припоминаю.
Выражение писать в return можно. Но присваивание это не совсем выражение, это фактически отдельное действие и нехорошо его совмещать с return. Если мы вообще всю программу в одну строчку запишем, работать она будет но читать ее будет трудно.
Неправильно: return $x = $a + $b;
Более правильно: $x = $a + $b; return $x;
Совсем правильно: return $a + $b;
Посмотри на эти 3 примера. Какой смысл писать 1-й или 2-й вариант когда есть третий?
> Тогда, мне нужно будет сделать эту в функцию с двумя циклами:
> Первый будет создавать новый SplObjectStorage, с помощью $s->attach(clone $object);
> Второй будет изменять изменять значения.
Не вижу смысла делать 2 цикла. Сделай один.
Учти еще один момент. Объекты передаются (как будто) по ссылке. Это значит что если ты меняешь объект в функции то он меняется в исходном массиве в любом случае, так как объекты не копируются, передается ссылка на тот же самый объект.
Потому применять array_map к массиву объектов чтобы получить на выходе новый массив объектов довольно глупо. Какой смысл создавать новый массив с теми же самыми объектами? Ты можешь пройтись по исходному массиву и поменять объекты в нем:
foreach ($objects as $obejct) {
$object->x= 2;
}
Эффект будет тот же самый только без создания второго массива.
Array_map используют для других целей, например извлечь результаты вызова метода в массив:
$result = array_map(function ($obejct) {
return $obect->getSomething( );
}, $objects);
Также, можно наоборот взять массив чисел и превратить в массив объектов:
$numbers = range(1, 10);
$objects = array_map(function ($number) {
return new SomeClass($number);
}, $numbers);
Синтаксис в PHP довольно громоздкий. В других языках преобразование массива через map выглядит гораздо компактнее:
Вот пример как в Руби с помощью функции map взять из массива объектов people все фамилии (из поля surname):
people.map { |p| p.surname }
Это эквивалентно такому php коду
array_map(function ($p) {
return $p->surname;
}, $people);
Потому в PHP функции вроде array_map используются реже.
Сейчас сайт сделан так что трипкод постоянно теряется. Я замучался его вводить.
> у меня git внезапно начал считать конкретный .php файл бинарным.
Какая кодировка? Не utf-16 случайно?
Также пишут git может реагировать на слишком длинные строки.
Принудительно сделать файл текстовым можно через http://git-scm.com/docs/gitattributes но я бы советовал вместо этого разобраться и исправить проблему с файлом.
>>450015
fopen/fwrite заменяется на file_put_content. ты наверно по какому-то древнему учебнику учился.
Ну и плохая идея начинать переменные с подчеркивания. Некрасиво же и непонятно чем _file лучше чем file? Тем что дольше печатать или тем что хуже читается?
>>450019
да. Библиотеки и фреймворки их используют .
> Как относиться к людям, которые вообще их не используют в 2015 году?
использовать ты их не обязан, а знать обязан.
>>450031
.gitattributes если он есть.
>>450039
HTML сделан для верстки страниц (альтернативных языков для этого нет, кроме XHTML). Ну а страницы уже могут использоваться для обмена информацией.
>>450051
Анон говорит что если не генерировать каждый год курс случайно, а генерировать случайное изменение (причем с большой вероятностью изменение небольшое, но иногда случаются обвалы) то будет смотреться более реалистично.
Кстати, я не купил ни одного доллара когда курс упал первый раз на 10% (и позже тоже). Я молодец? В 2008 году кстати тоже не покупал.
>>450067
> Тогда, это нужно сделать вот так:
> $r = $o->type;
> $r = $r x 2;
> return $r
> Верно?
да
> Но как это применить к определенному параметру? Передавать изначально в функцию?
Прописать в функции все что надо.
> Не могу сообразить. Подскажи плиз.
$result = array_map(function ($x) { return pow($x, 2); }, range(1, 10));
var_dump($result); // 1 , 4, 9, 16 ...
> Эм... Я не припоминаю такого. Помню что ты говорил что можно передавать сразу функцией
Значит не тебе говорил
> а вот что бы я передавал выражение когда-либо, за исключением этого случая - я не припоминаю.
Выражение писать в return можно. Но присваивание это не совсем выражение, это фактически отдельное действие и нехорошо его совмещать с return. Если мы вообще всю программу в одну строчку запишем, работать она будет но читать ее будет трудно.
Неправильно: return $x = $a + $b;
Более правильно: $x = $a + $b; return $x;
Совсем правильно: return $a + $b;
Посмотри на эти 3 примера. Какой смысл писать 1-й или 2-й вариант когда есть третий?
> Тогда, мне нужно будет сделать эту в функцию с двумя циклами:
> Первый будет создавать новый SplObjectStorage, с помощью $s->attach(clone $object);
> Второй будет изменять изменять значения.
Не вижу смысла делать 2 цикла. Сделай один.
Учти еще один момент. Объекты передаются (как будто) по ссылке. Это значит что если ты меняешь объект в функции то он меняется в исходном массиве в любом случае, так как объекты не копируются, передается ссылка на тот же самый объект.
Потому применять array_map к массиву объектов чтобы получить на выходе новый массив объектов довольно глупо. Какой смысл создавать новый массив с теми же самыми объектами? Ты можешь пройтись по исходному массиву и поменять объекты в нем:
foreach ($objects as $obejct) {
$object->x= 2;
}
Эффект будет тот же самый только без создания второго массива.
Array_map используют для других целей, например извлечь результаты вызова метода в массив:
$result = array_map(function ($obejct) {
return $obect->getSomething( );
}, $objects);
Также, можно наоборот взять массив чисел и превратить в массив объектов:
$numbers = range(1, 10);
$objects = array_map(function ($number) {
return new SomeClass($number);
}, $numbers);
Синтаксис в PHP довольно громоздкий. В других языках преобразование массива через map выглядит гораздо компактнее:
Вот пример как в Руби с помощью функции map взять из массива объектов people все фамилии (из поля surname):
people.map { |p| p.surname }
Это эквивалентно такому php коду
array_map(function ($p) {
return $p->surname;
}, $people);
Потому в PHP функции вроде array_map используются реже.
> Первый будет создавать новый SplObjectStorage, с помощью $s->attach(clone $object);
Погоди, зачем клонировать объекты? В ООП в 99% случаев мы хотим получить тот же самый объект.
Я думаю, map должен работать по другому. Он должен возвращать массив значений, которые вернет функция. То есть map обходит SplObjectStorage, для каждого объекта вызывает функцию и возвращает массив значений. Например ее можно использовать так, чтобы собрать результаты вызова метода:
$results = $storage->map(function ($obj) {
return $obj->getTotalSalary( );
});
Я не вижу какой смысл создавать второй Storage с теми же самыми объектами или их клонами. зачем это надо?
А вот filter — это другое. Она должна создавать и возвращать новый Storage с отобранными объектами.
А если у тебя есть Storage с объектами и ты хочешь их изменить, то тебе нужен не map, а foreach:
$storage->each(function ($o) {
$o->x = 2;
});
>>450078
Лучше не ставить новый курс, а менять существующий:
If(mt_rand == 1) {
$cource += 1; // вырос на 1 руб
Так реалистичнее.
>>450086
array_keys используй например. Я вижу что ты явно пропустил уроки про работу с массивами, и берешься сразу код писать. Плохо.
>>450145
А что плохого то? По твоему постоянно переключаться и переделывать все быстрее будет? Плюс, можно сразу подписать где мы хотим флоаты сделать например, где инлайн блоки, прикинуть как макет будет тянуться, какой блок какой расталкивает и в каких местах.
>А что плохого то?
Лишние действия.
>По твоему постоянно переключаться и переделывать все быстрее будет?
Что переделывать-то? Нужны данные из макета, полез и посмотрел.
>Плюс, можно сразу подписать где мы хотим флоаты сделать например, где инлайн блоки, прикинуть как макет будет тянуться, какой блок какой расталкивает и в каких местах.
Я это делаю в голове. Брат жив, зависимость есть.
> Нужны данные из макета, полез и посмотрел.
Ну так мерять расстояние и размеры удобнее сразу, а не по одному, по моему. Особенно когда элементы бок к боку стоят. Чем постоянно переключаться.
ты код покажи который у тебя это дело собирает сначала.
> Я вижу что ты явно пропустил уроки
Я уже все написал.
Там было все проще. Просто я тупил и не умел работать с json массивом.
На пхп начал писать вчера обедом, уроки я вообще не посещал.
Сразу конечно удобнее, но только если ты способен все это держать в голове. Записывать на бумажечку как минимум странно, как максимум долго, если твой макет хоть чуть выше базового.
Покажи кусок кода или код который у тебя этот json собирает сначала. И где ты запускаешь свой foreach () {}
>>450078
Ну смотри, у тебя неправильная строчка тут:
If(mt_rand == 1) {
ты же сохранил уже результат функции mt_rand() в переменную $course перед этим. Используй её в проверке. А лучше заведи другую переменную под это, а то у тебя в переменной $cource совсем не курс лежит, после строчки $cource = mt_rand(1,6);
Кого заменить? Я пишу просто фо фан. Это никакого отношения к гудгеймпу не имеет. Языка я не знаю, но вот решил просто попробовать сделать аналог http://prestige-gaming.ru/streams/ например.
Суть в том, что когда ты вводишь ник - к тебе приходит json массив от апи гг. И этот массив начинается с id:{}. То есть получается начало массива и его ид не известен т.к я встраиваю других юзверей и их ид без отдельного json запроса мине не известны, только ник.
Ну и я думал, что без этого не работает. Однако там похуй на это первое значение id и можно сразу подставлять ник и делать foreach сразу с ником к массиву. На первое ид там похуй.
Теперь я хочу сделать сортировку стримов ГГ по количеству зрителей. У АПИ твича это говно как-то само работает, а вот на ГГ нет.
Вообще я бы хотел этот код как-то встроить в Вордпресс, например, или в код вордпресс и сделать уже серьезное говно. Но вот вп знаю только на уровне тем и банально удалить что-то, чтобы не показывало автора, кек.
Если хочешь, то я могу нанять тебя за 30 рублей/неделя.
Чет я перечитал тебя дважды, и все равно ничего не понял. Массив там такого вида:
массив с 1 элементом, название которого это айдишник игрока, а значение - это другой массив с его данными или хуй пойми чем.
> но на компьютер тебе ставить их не обязательно. Тебе главное их подключить к странице либо через Google Fonts либо через этот конструктор
Как же я их подключу через конструктор, если кнопка upload fonts загружает шрифт с жесткого диска. Другой я там не нашел. Ну а в гугл фонтс нужный мне шрифт недоступен.
Может быть у тебя несколько php.ini и ты правишь не тот. Увидеть используемый файл можно выполнив команду
php -i
И найдя строку Loaded config file.
Увидеть список подключенных модулей можнл набрав
php -m
Если ты используешь сборки вроде WAMP то тебе надо запускать консоль WAMP чтобы она выставила нужные переменные окружения.
Пардон, сажа приклеилась.
php.ini-development это не конфиг а пример конфига. Правильный файл называется php.ini
>>450313
> Языка я не знаю, но вот решил просто попробовать сделать
Это тред изучения php. Для тех, кто хочет учиться писать правильно. Что ты тут тогда забыл?
Непонятно зачем ты тут настойчиво выкладываешь примеры того как делать не надо. Что ты хочешь сказать этим? Это такой изысканный вариант запостить сажу?
Найди похожий внешне шрифт на том же Google Fonts.
>>450322
Задача 1 на XML
Дана HTML-страница: http://spb.hh.ru/applicant/searchvacancyresult.xml?areaId=231¬WithoutSalary=&orderBy=0&text=xml&professionalAreaId=0&desireableCompensation=&compensationCurrencyCode=RUR
Надо загрузить ее 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
Условия в ней примерно такие: пользователь вводит адрес в одной из столиц (Москва или Спб — выбери сам), скрипт определяет район города и ближайшее метро.
Делается это с помощью геокодера Яндекса: http://api.yandex.ru/maps/doc/geocoder/desc/concepts/input_params.xml
Пример запроса: http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7
Первым запросом ты определяешь координаты по адресу (и существует ли адрес). Вторым обратным запросом, определяешь район и метро по координатам. Для запросов используется формат XML, так что использовать DOM придется. Для отправки запросов достаточно file_get_contents или curl. На бесплатном хостинге запросы отправлять нельзя, так что скрипт должен работать их командной строки на локалхосте.
Есть еще такая, на работу с большими файлами:
> 3) работа с ФИАС (сначала придется скачать 1.5 Гб архив с базой), надо скриптом разобрать базу и составить список районов и городов нашей страны. Огромную базу таких размеров в память не засунешь, надо исхитряться, например, с помощью XMLReader. Ну или если тебе не нравится ФИАС, можно сделать что-то аналогичное с OpenStreetMAp, например, распарсить оттуда координаты остановок автобусов.
Найди похожий внешне шрифт на том же Google Fonts.
>>450322
Задача 1 на XML
Дана HTML-страница: http://spb.hh.ru/applicant/searchvacancyresult.xml?areaId=231¬WithoutSalary=&orderBy=0&text=xml&professionalAreaId=0&desireableCompensation=&compensationCurrencyCode=RUR
Надо загрузить ее 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
Условия в ней примерно такие: пользователь вводит адрес в одной из столиц (Москва или Спб — выбери сам), скрипт определяет район города и ближайшее метро.
Делается это с помощью геокодера Яндекса: http://api.yandex.ru/maps/doc/geocoder/desc/concepts/input_params.xml
Пример запроса: http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7
Первым запросом ты определяешь координаты по адресу (и существует ли адрес). Вторым обратным запросом, определяешь район и метро по координатам. Для запросов используется формат XML, так что использовать DOM придется. Для отправки запросов достаточно file_get_contents или curl. На бесплатном хостинге запросы отправлять нельзя, так что скрипт должен работать их командной строки на локалхосте.
Есть еще такая, на работу с большими файлами:
> 3) работа с ФИАС (сначала придется скачать 1.5 Гб архив с базой), надо скриптом разобрать базу и составить список районов и городов нашей страны. Огромную базу таких размеров в память не засунешь, надо исхитряться, например, с помощью XMLReader. Ну или если тебе не нравится ФИАС, можно сделать что-то аналогичное с OpenStreetMAp, например, распарсить оттуда координаты остановок автобусов.
частично выложен тут:
http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (первые треды из pr)
http://www.mediafire.com/?3zxb19z9j2q5gf2 (древние 11-19 треды, 74 Мб)
и на дропбоксе: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (периодически дежит)
Но вообще, в архиве тредов ничего особо ценного нет, больше флуда всякого.
<html>
<head>
<meta charset="utf-8">
<title>Тестируем пхп</title>
</head>
<body>
<?php echo '<p>Привет, мир!</p>'; ?>
</body>
</html>
Сам фаил в какой кодировке?
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
XHTML давно умер (потому что никто его не использовал, все писали псевдо XHTML который браузер парсил как HTML. Зачем так делали, до сих пор не понимаю).
Это старая бага/фича Денвера, в настройках апача надо принудительно выставить чарсет. А вообще скачай денверфаст, там все это есть http://rutracker.org/forum/viewtopic.php?t=4283915
Окей, я типа сделал сириусли что-то полезное скопировав и скомпилировав код опа в один файл? Я качаюсь в пхп и ООП, сириусли?
Там дальше будет задача про ООО Вектор. А эта задача проверяет самые базовые вещи: способен ли ты понимать то что написано и способен ли составить куски в нужном порядке. Ну и должна повышать уверенность в своих силах перед более сложной задачей.
Кстати там ошибка, смотри внизу страницы
> PHP Notice: Undefined variable: naswers in /home/hj7Onb/prog.php on line 72
Вектор делай. Там еще будет дополнительный пункт про антикризисные меры, если тебе мало покажется.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
>>450486
Вообще хорошо что задача кажется тебе легкой. Многие боятся ООП и говорят что он нереально сложный и спрашивают реально ли стать программистом без ООП и фреймворков.
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
Вот что пишет.
В учебнике опа все доступно объяснено, помню пытался понять по какой-то книге по С++, что такое конструктор, но так и не осилил. А у опа все просто и понятно: конструктор - метод, который автоматически вызывается при создании объекта класса.
хедеры должен отсылаться ДО любых операторов вывода и любого html-я, если нужно после добавь ob_start() в начало документа
Не понимат тебя, поясни конкретнее. Массивы вроде как это массивы, а объекты это объекты.
http://ideone.com/4E9bKV
Ты про ассоциативные массивы? Которые похожи по структуре на объекты?
>Прописать в функции все что надо
Получается мы для каждого класса будем писать отдельный метод? Мы же заранее не можем знать какие свойства будут.
>Какой смысл создавать новый массив с теми же самыми объектами? Ты можешь пройтись по исходному массиву и поменять объекты в нем:
>>449874
>Это неверно. array_map всегда возвращает новый массив не изменяя старый. А ты возвращаешь тот же самый объект.
Я запутался =_=
>>450148
>Я думаю, map должен работать по другому. Он должен возвращать массив значений, которые вернет функция. То есть map обходит SplObjectStorage, для каждого объекта вызывает функцию и возвращает массив значений.
Не понял, а зачем нам получать массив? Я думал, object_filter будет нужен для того что бы поменять определенные параметры в объекте или получить новые объекты с изменением определенных параметров.
Ну в JS массив - это просто набор значений с порядковыми номерами, а объект - набор ключ-значение. А в PHP можно создавать массивы, у которых вместо номеров стоит текстовый ключ.
И что, это плохо? Больше возможностей же
Теперь то я понял в чём отличие более менее реальных задач от учебных. У меня был вот такой XML который я собственно сам и создал:
<stat>
<author>Aramis</author>
<name>Portos</name>
<pubyear>1995</pubyear>
<price>2000</price>
</stat>
В самом простом виде с ним можно было работать так:
$doc = new DOMDocument();
$doc->load("books.xml");
$root = $doc->documentElement;
$child = $root->childNodes;
echo $root->textContent;
Но если я делаю что то подобное с этой ссылкой (само собоq используя loadHTML), то нечего не получается, выскакивают ошибки, а если вывести
print_r($child);
то получается
DOMNodeList Object ( [length] => 1 )
В textContent которого будет лежать всего лишь строка со ссылкой. Я немного не могу въехать как делать,
Теперь то я понял в чём отличие более менее реальных задач от учебных. У меня был вот такой XML который я собственно сам и создал:
<stat>
<author>Aramis</author>
<name>Portos</name>
<pubyear>1995</pubyear>
<price>2000</price>
</stat>
В самом простом виде с ним можно было работать так:
$doc = new DOMDocument();
$doc->load("books.xml");
$root = $doc->documentElement;
$child = $root->childNodes;
echo $root->textContent;
Но если я делаю что то подобное с этой ссылкой (само собоq используя loadHTML), то нечего не получается, выскакивают ошибки, а если вывести
print_r($child);
то получается
DOMNodeList Object ( [length] => 1 )
В textContent которого будет лежать всего лишь строка со ссылкой. Я немного не могу въехать как делать,
>450686\t
Выучил первые уроки из учебника, 2 месяца как раз заняло, написал резюме, сами позвонили и взяли, но я съебал. Сижу терь дома сычую.
За пару месяцев ОП научил меня делать простую регистрацию. Потом спонтанно решил поскроллить вакансии по php у себя в провинции. Нашел, позвонил, пригласили, написал короткое резюме в пол страницы, ответил на пару вопросов на собеседовании, приняли.
Закончилось все тем, что у моего работодателя были какие-то проблемы с налогами и ему заблокировали счет. Он мне до сих пор должен лол.
Научился чему-нибудь? РАзве после 3х месяцев опыта не стало легче найти снова работку?
Просто там был Битрикс. Мне он очень сильно не понравился, и я решил что лучше будет изучить какой-нибудь фреймворк типо Slim или Yii, чем возвращаться на что-то подобное. Да и просто желания нету работать, если честно ◕ ‿ ◕
Не думаю что я что-то потерял на это работе, в любом случае я получил хоть какой-то опыт.
Вывести XML можно так
$xml = $doc->saveXml($node); // смотри мануал по saveXML
var_dump($xml);
>>450687
Фреймворки бы учил и задачу про файлообменник делал, лентяша. Я может соберусь с силами и по ней тоже комментарии напишу.
>>450718
Там формально есть какой-то ООП, но по моему при натяжке дизайна просто надо в шаблоны вставлять готовые куски кода:
http://faq.linemedia.ru/byistraya-natyazhka-vyor/
http://habrahabr.ru/post/162881/
Битрикс не уникален, практически все CMS (Drupal, Wordpress) написаны гм.. людьми не особо знакомыми с ООП, паттернами, промышленной разработкой, в общем по ощущениям их пишут какие-то студенты-самоучки в плохом смысле этого слова. Даже если там применяется ООП, то часто неправильно. Ну и упор в CMS делается на редактирование через админку, а не программирование.
По моему опыту, пока твой шаблон по структуре соответствует стандартному, все будет хорошо, но как только ты захочешь сделать что-то нестандартное, тебя ждет боль. Я не знаю насчет битрикса, но платные CMS иногда содержат закрытый (обфусцированный) код, я с такой CMS когда-то работал и в итоге было проще некоторые вещи делать яваскриптом, изменяя текст страницы после загрузки, чем разобраться как это сделать средствами CMS. А в той CMS с которой я работал гении придумали свой язык шаблонов (без циклов и ветвлений разумееся и без htmlspecialchars), сами шаблоны хранились в базе и редактировать их можно было только через админку (что исключало возможность положить их в CVS или деплоить на свервер скриптом, все руками).
Ну и не знаю, можно ли делать какие-то выводы, но вот например Битрикс ищет разрабочика за 20 000 р (~350 долл.): http://www.1c-bitrix.ru/about/job.php#webdev
Не факт конечно что он над самой CMS будет работать, ну и может у них требования не высокие, но все же, у них некоторое редакции битрикса дороже стоят чем зарплата этого разработика.
Вообще, по хорошему тебе бы стоило сделать отдельный тред про разработку своего проекта, но так как модераторы не разрешат это сделать (почему? непонятно), можешь вести дневничок тут.
> Теперь я хочу сделать сортировку стримов ГГ по количеству зрителей
Отсортируй сам на стороне php, там есть sort, usort и еще куча похожих функций.
>>450674
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, а просто принудительно все кешировал.
Проверь нет ли пробелов или пустых строк перед <?php
>>450629
> $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 (она поддерживает кириллицу и любые символы).
Так, вообще неплохо. Исправь замечания и переходи к более сложной задаче.
Ты не понимаешь что такое объект. Объект в программировании — это экземпляр класса. Массив им не является.
В PHP массив это ассоциативный упорядоченный массив. Почему бы и нет.
А объекты и классы в PHP есть настоящие, в отличие от JS.
>>450658
В JS это называют не только объект, а пишут «хеш» (видимо сокращение от хеш-таблицы), «map» или «словарь».
В PHP есть настоящие классы и объекты, наследование, итнтерфейсы и все прочее, и с этим дела лучше чем в JS где классы обещают завезти только в ES6.
>>450657
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 это получение массива значений и отбор части объектов по условию.
Ты не понимаешь что такое объект. Объект в программировании — это экземпляр класса. Массив им не является.
В PHP массив это ассоциативный упорядоченный массив. Почему бы и нет.
А объекты и классы в PHP есть настоящие, в отличие от JS.
>>450658
В JS это называют не только объект, а пишут «хеш» (видимо сокращение от хеш-таблицы), «map» или «словарь».
В PHP есть настоящие классы и объекты, наследование, итнтерфейсы и все прочее, и с этим дела лучше чем в JS где классы обещают завезти только в ES6.
>>450657
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 это получение массива значений и отбор части объектов по условию.
В JS массив - встроенный объект, плохо ты его учил раз такого не знаешь.
mbstring . сам файл есть , пусть стандартный , в файле extension=php_mbstring.dll раскомменчен , но в php.info модуль не появляется. Как это лечить?
http://jsfiddle.net/xf8bLowt/
Спасибо, теперь по теме подскажи.
<?php
error_reporting(-1);
$dollars = 200; / Число долларов /
$exchangeRate = 32.24; / Курс обмена /
$roubles = $dollars * $exchangeRate
echo "$dollars долларов можно обменять на $roubles рублей";
О чем я забываю?
Я так понял ты на айдеоне код запускаешь. Он пишет ошибки внизу, я выделил красным. Видишь, написано in line 8? Значит на 8ой строке ошибка, точнее перед 8ой строкой нет точки с запятой.
Спасибо за разъяснение тугодуму
>ideone
Тогда ничем помочь не могу - не сталкивался с ним.
Ставь все локально и настраивай как тебе угодно будет.
php файл лежит в www , там папка test , в vhosts.conf я дописал Listen 8122 , ну и прописал путь на эту папку test.
Пишу в браузере путь на папку , там выбираю нужный.
Там еще куча мелких файлов , чисто php , они грузятся нормально, а этот нет.
Вот я не до конца понимаю когда в html файле php код как его правильно запускать.
>А в твоем случае надо как-то отслеживать, если имя поменялось, и менять fullName. Проще не хранить его вообще.
Хорошо, согласен, а я сначала порадовался себе, что круто придумал: сразу в конструкторе вычислять это, так как на выход идет имя и уже есть с чем работать.
>Есть str_repeat (она поддерживает кириллицу и любые символы).
Когда писал эти функции я бегло пробежался по главе учебника со стороками, но не нашел там ничего, поэтому сделал как в голову пршло, не думаю что мой метод был плох, просто лишняя строчка и действие. В общем переделал код, спасибо за пояснения. Улучшил еще вывод зп как по мне, сразу видно из чего составляется зп
Ну у тебя должен быть настроен apache + php
и все это должно быть запущено
далее php код в файле должен стоять внутри
<?php
...
?>
И тогда ты просто в браузере открываешь этот свой html файл и у тебя интерпритатор выполняет все.
Враппер чего? Пиши подробнее, телепаты в отпуске. Ну и проверь что ты загуглил вопрос сначала.
> в файле extension=php_mbstring.dll раскомменчен
В каком файле? Ты уверен что это тот файл который используется как конфиг (посмотреть можно в phpinfo в loaded config file). Сервер перезапустил?
ideone пишут ошибки внизу. Если ты запускаешь код кнопкой ideone it то не пишет пока не обновишь страницу.
> Пишу в браузере путь на папку
как выглядит путь?
file:///c:/files... (неправильный ответ)
http://localhost/... (правильный)
class Db {
protected $host = "localhost";
protected $user = "root";
protected $pass = "";
protected $dbname = "journal";
public $mysqli;
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 и напишу там функцию конструктор, всё перестанет работать так как исчезнет подключение к базе данных? В чём проблема? И если я решаю задачу про студентов в стиле ООП, то как кстати лучше делать все параметры студента записывать в свойства объекта, или просто добавлять их в методы как обычные переменные?
class Db {
protected $host = "localhost";
protected $user = "root";
protected $pass = "";
protected $dbname = "journal";
public $mysqli;
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 и напишу там функцию конструктор, всё перестанет работать так как исчезнет подключение к базе данных? В чём проблема? И если я решаю задачу про студентов в стиле ООП, то как кстати лучше делать все параметры студента записывать в свойства объекта, или просто добавлять их в методы как обычные переменные?
----Клавиша-shift--------
http://ideone.com/HIkv00
----Yoda-Speak-----------
http://ideone.com/6ampes
----Числа-прописью------
http://ideone.com/nmjiUV
----Калькулятор----------
http://ideone.com/ZjAixJ
--------------------------
Требую конструктивной критики.
>но если я добавлю пару свой в class Student и напишу там функцию конструктор
Потому что в конструкторе наследника нужно вызывать parent::__construct().
И я не думаю, что тебе нужен класс Db только лишь для подключения к базе данных. Проще и логичнее будет передать базу через конструктор $student = new Student($mysqli).
>как кстати лучше делать все параметры студента записывать в свойства объекта
Какие параметры? Если ты про те, что являются полями в таблице, то да.
Спасибо
>Проще и логичнее будет передать базу через конструктор $student = new Student($mysqli).
В этом случае для каждого объекта будет свою подключение?
Подключение будет одно $dbh = new PDO($dsn, $user, $password), но передавать ты его сможешь разным объектам.
> <img src="<?= Thumbnail::link('/image/uploads/1234567.png', 400, 300, Thumbnail::MODE_CROP) ?>">
Может кто-нибудь разобрать по частям написанное?
Вызов статического метода класса
>Thumbnail
Класс
>link()
Метод
>('/image/uploads/1234567.png', 400, 300, Thumbnail::MODE_CROP)
Аргументы. Первый очевидно урл, второй и третий размеры, четвертый константа
Thumbnail — класс.
link — статичный метод класса.
В скобках параметры необходимые для работы метода (исходная картинка, ширина превью, высота превью, метод преобразования).
Метод должен отдать ссылку на превьюшку.
http://ideone.com/VGQDq5
//Я думал, object_map
Я перепутал там, извини.
>>450809
Может это покажется глупо, но я не согласен что в нашем случае object_map не должен менять значения. Возможно он должен возвращать массив, но поменять исходные значения он тоже должен, иначе в будущем будет не удобно вызывать новые свойства через этот массив.
Хорошо, только border добавь. И можешь цвета менее насыщенными сделать? Ты конечно достаточно похоже цвет на глаз подобрал, но там цвета не такие насыщенные. Верстальщик должен уметь пипеткой в графическом редакторе определять цвет, так что потренируйся.
>>450936
Ок, переходи ко второй задаче про вектор.
>>450986
А что это за странный паттерн проектирования для работы с БД? Ты урок https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md читал?
В твоем случае плохо:
— параметры соединения с БД прописаны в классе
— у функций не проставлено private/public
— название класса неправильное. можно подумать что класс Student хранит информацию о студенте, но это не так
— каждый новый экземпляр Student создает свое соединение с Бд
— неясно, а что будет возвращать фукнция чтения студентов из БД? Массивы? Тогда это не очень-то и похоже на ООп
> И если я решаю задачу про студентов в стиле ООП, то как кстати лучше делать все параметры студента записывать в свойства объекта, или просто добавлять их в методы как обычные переменные?
Лучше прочитать урок по ссылке и сделать как там советуется, либо сделать по-другому, но аргументировать почему и какие преимущества у твоего подхода.
Названия классов неправильные. Вчитайся сам:
> class Student extends Db
Студент наследуется от БазыДанных. Это как? Студент — это улучшенная версия БазыДанных? Это показывает что ты неправильно выбрал названия для классов. Например класс Db правильнее назвать DbConnector а Student как StudentDbConnector или как-то так. Ну а еще лучше переписать нормально.
>>451011
> в этом случае я так понимаю надо сделать перенаправление на страницу где выводится список студентов, но как его сделать если у меня уже выведена форма?
Не надо спешить выводить форму. Ты урок по работе с формами читал? https://github.com/codedokode/pasta/blob/master/forms.md
> но в таком случае в 2 страницы я уже не вложусь, так как их будет как минимум три (там же ещё список студентов)
ну и пусть.
>>451106
> Может это покажется глупо, но я не согласен что в нашем случае object_map не должен менять значения
Суть функции array_map в том что она создает новый массив (на основе пропущенных через функцию значений). Зачем она должна менять исходный? Какая от этого польза? Приведи пример как ее можно использовать?
От этого только появляются лишние побочные эффекты.
Вот мой пример использования array_map. на вход она получает массив студентов, на выходе дает массив фамилий:
$surnames = $storage->map(function ($student) {
return $student->getSurname( );
});
Если тебе надо поменять объекты в массиве, лучше для этого сделать отдельный метод например each или iterate для этого. Он разумеется ничего возвращать не должен.
> иначе в будущем будет не удобно вызывать новые свойства через этот массив.
Вызывать свойства через массив — это как?
> public static function object_filter(callable $c, $objects) {
Зачем передавать $objects если мы можем использовать $this и сделать метод не статическим? Ты пытаешься сделать отдельный набор функций, в то время как мы можем просто расширить класс нашими методами. Кроме редких случаев, статические методы в ООП это неудобно.
> object_filter
Давай называть как принято в PSR, без подчеркиваний.
> SplObjectFunctions
Я бы назвал по-другому, например, ExtendedSplObjectStorage или как-то так.
Названия классов неправильные. Вчитайся сам:
> class Student extends Db
Студент наследуется от БазыДанных. Это как? Студент — это улучшенная версия БазыДанных? Это показывает что ты неправильно выбрал названия для классов. Например класс Db правильнее назвать DbConnector а Student как StudentDbConnector или как-то так. Ну а еще лучше переписать нормально.
>>451011
> в этом случае я так понимаю надо сделать перенаправление на страницу где выводится список студентов, но как его сделать если у меня уже выведена форма?
Не надо спешить выводить форму. Ты урок по работе с формами читал? https://github.com/codedokode/pasta/blob/master/forms.md
> но в таком случае в 2 страницы я уже не вложусь, так как их будет как минимум три (там же ещё список студентов)
ну и пусть.
>>451106
> Может это покажется глупо, но я не согласен что в нашем случае object_map не должен менять значения
Суть функции array_map в том что она создает новый массив (на основе пропущенных через функцию значений). Зачем она должна менять исходный? Какая от этого польза? Приведи пример как ее можно использовать?
От этого только появляются лишние побочные эффекты.
Вот мой пример использования array_map. на вход она получает массив студентов, на выходе дает массив фамилий:
$surnames = $storage->map(function ($student) {
return $student->getSurname( );
});
Если тебе надо поменять объекты в массиве, лучше для этого сделать отдельный метод например each или iterate для этого. Он разумеется ничего возвращать не должен.
> иначе в будущем будет не удобно вызывать новые свойства через этот массив.
Вызывать свойства через массив — это как?
> public static function object_filter(callable $c, $objects) {
Зачем передавать $objects если мы можем использовать $this и сделать метод не статическим? Ты пытаешься сделать отдельный набор функций, в то время как мы можем просто расширить класс нашими методами. Кроме редких случаев, статические методы в ООП это неудобно.
> object_filter
Давай называть как принято в PSR, без подчеркиваний.
> SplObjectFunctions
Я бы назвал по-другому, например, ExtendedSplObjectStorage или как-то так.
Ты читал подробное задание с комментариями и советами? https://github.com/codedokode/pasta/blob/master/student-list.md Там много полезного.
>>451000
> Клавиша shift
А что с форматированием? Где оступы? тяжело же читать. Надо через phpformatter прогонять либо использовать редактор умеющий форматировать код.
> mb_substr($text,1,mb_strlen($text))
Третий аргумент можно не указывать если тебе нужен текст до конца строки.
Не исправляются лишние пробелы вокруг запятой: http://ideone.com/83hWyi
Не делаются заглавными буквы после воскл. знака: http://ideone.com/fgE9Cg
> Yoda-Speak
> $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)
Тут надо применить деление с остатком %
Также, у тебя там местами не один, а два пробела между словами. Один из вариантов — собирать фразу не в переменной-строке, а в переменной-массиве куда класть по одному слову или фразе за раз.
> Yoda-Speak
> $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)
Тут надо применить деление с остатком %
Также, у тебя там местами не один, а два пробела между словами. Один из вариантов — собирать фразу не в переменной-строке, а в переменной-массиве куда класть по одному слову или фразе за раз.
> Калькулятор
> $op = $char;
>\t$number = 0;
Это повторяется раз 5. Избавься от копипасты.
Огромный if надо бы перевернуть ради того чтобы было проще читать код.
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return или exit;
}
50 строк;
> Калькулятор
> $op = $char;
>\t$number = 0;
Это повторяется раз 5. Избавься от копипасты.
Огромный if надо бы перевернуть ради того чтобы было проще читать код.
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return или exit;
}
50 строк;
Смотря где, в разных компаниях по разному.
Но хорошо бы уметь чтобы например при правке кода не ломать костылями верстку которую делал верстальщик. Да и разве это долго? С нашими заданиями на CSS/HTML ты недели за 2-3 научишься неплохо верстать.
Ну и знать основы HTML/CSS в любом случае надо.
>Суть функции array_map в том что она создает новый массив (на основе пропущенных через функцию значений). Зачем она должна менять исходный? Какая от этого польза? Приведи пример как ее можно использовать?
Например, в прошлой задаче с вектором было необходимо поднять начальную зарплату некоторым сотрудникам. Как раз в этом случае был бы полезен такой способ.
>Вызывать свойства через массив — это как?
Ой. Ну я имел ввиду, что новые значения свойств сложенные в массив, то есть вот так:
$property = $object->property;
$array[] = $propery x 2;
Согласись, что если бы нам в будущем понадобилось свойство propery с новым значением, было бы удобней вызвать его с помощью класса(с помощью метода или напрямую), чем писать = array[0]; По крайней мере мне кажется, что было бы удобней через класс.
Прошу прощение за то что неясно выразился в начале. Надеюсь сейчас я более менее ясно понятно.
>Надеюсь сейчас я более менее ясно понятно.
Б-же, какой же я...
Надеюсь сейчас более менее понятно*
> Например, в прошлой задаче с вектором было необходимо поднять начальную зарплату некоторым сотрудникам. Как раз в этом случае был бы полезен такой способ.
Для этого есть другая функция: array_walk (в разных языках и библиотеках она называется each, forEach, iterate). Сделай и ее тогда.
> Согласись, что если бы нам в будущем понадобилось свойство propery с новым значением, было бы удобней вызвать его с помощью класса(с помощью метода или напрямую), чем писать = array[0]; По крайней мере мне кажется, что было бы удобней через класс.
В таком случае нам не нужен map вообще, просто делаем
$object = $storage[0];
И в любой момент обращаемся к $object.
http://ideone.com/VGQDq5
>>451170
>В таком случае нам не нужен map вообще, просто делаем
>
>$object = $storage[0];
>
>И в любой момент обращаемся к $object.
Ну а если у нас будет тысяча объектов в SplObjectStorage и всем им надо поменять какое-то свойство? Как раз для этого и подошел мой способ.
Если честно, то мне кажется что моя функция objectMap не очень подходит для ООП. Может в каких-то редких случаях и пригодилось бы, но это уже были бы какие-то индивидуальные случаи. Если использовать её как клон array_map, то ты прав - она должна возвращать массив с новыми значениями. Но зачем нам этот массив если мы используем ООП? Поэтому я и говорю она не очень подходит для ООП, IMHO.
В mysql БД передаю текст статьи, статья пишется через CKEditor, поэтому абзацы уже разделены тегом p.
На главной нужно сделать предпросмотр статей на главной (просто чтобы только первый абзац статьи выводился), поэтому хочу в отдельное поле БД сохранять этот первый абзац и его выводить в качестве предпросмотра. Как этот первый абзац отделить от всего текста (он ограничен тегом p) чтобы записать его в отдельное поле?
https://gist.github.com/39d662f18599be21bbfd.git
знак "равно" в html-коде не отбивают пробелами, маня. не то чтобы это не работает, хоть пять их туда въеби - браузер сожрет любое говно. просто не красиво
>Как этот первый абзац отделить от всего текста (он ограничен тегом p) чтобы записать его в отдельное поле?
Но зачем? Читай уроки опа, там есть, например, такая замечательная штука, как регулярные выражения, с их помощью можно выводить только тот кусок текста, который тебе нужен (в данном случае от начала до тега p - /*<p>/). И не надо будет городить отдельное поле. Впрочем, если сильно хочешь, то можно и так, абзац отделишь с помощью тех же регулярок.
Так то ж под шиндовс.
И всё равно чет не фурычит. Картинки не появляются в каталогах.
https://gist.github.com/uniunicorn/39d662f18599be21bbfd
P.S. Может быть, проблема в неправильной конфигурации php.ini?
На всякий случай:
> file_uploads = On
> upload_tmp_dir = "/var/www/tmp"
> upload_max_filesize = 20M
Остальное не трогал.
> Ну а если у нас будет тысяча объектов в SplObjectStorage и всем им надо поменять какое-то свойство? Как раз для этого и подошел мой способ.
Ты наверно невнимательно прочитал мой пост. Для этого есть другая функция, array_walk (она же each, forEach, iterate). map не для этого.
Вот посмотри например на JS библиотеку для работы с коллекциями underscore. там есть и each, и map:
http://underscorejs.ru/#each
http://underscorejs.ru/#map
(про остальные функции тоже можешь почитать для развития кругозора, особенно про reduce).
> Но зачем нам этот массив если мы используем ООП? Поэтому я и говорю она не очень подходит для ООП, IMHO.
Ну представь такие задачи:
- дан массив студентов. Найти и вывести имена, которые встречаются более чем у одного студента
- дан массив студентов. Найти возраст самого младшего и самого старшего из них.
- дан массив работников. Найти общую сумму всех их зарплат
Тут подойдет функция map. Хотя конечно эти же задачи и через reduce решаются.
> Но зачем нам этот массив если мы используем ООП?
Массив использовать для хранения коллекции объектов вполне можно, почему нет? в PHP вроде все равно нет объектов-массивов (хотя есть, ArrayObject: http://php.net/manual/ru/class.arrayobject.php )
Плохо когда массивы пытаются использовать как аналоги объектов вроде
$student = [
'name' => 'Иван'
];
$students[] = student;
do_something($students);
Ошибки выводятся? У тебя включено отображение ошибок?
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
Тебе надо запускать программу из командной строки командой
c:/php/php.exe d:/files/1.php
Вот гайд по командной строке: https://gist.github.com/codedokode/10539568
Если php у тебя в PATH то можно писать просто php и если программа в текущем каталоге то можно писать просто 1.php
Вместо денвера советую ставить все самому, и Апач, и MySQL, а пока можешь так запускать.
> в паскале писать в консоль, и программа это читала
Надо открыть и читать STDIN:
http://php.net/manual/ru/features.commandline.io-streams.php
http://php.net/manual/ru/wrappers.php.php
заметь что в php много функций чтения. Это
fread
fgets
file_get_contents (прочитать все данные из потока)
Тебе надо запускать программу из командной строки командой
c:/php/php.exe d:/files/1.php
Вот гайд по командной строке: https://gist.github.com/codedokode/10539568
Если php у тебя в PATH то можно писать просто php и если программа в текущем каталоге то можно писать просто 1.php
Вместо денвера советую ставить все самому, и Апач, и MySQL, а пока можешь так запускать.
> в паскале писать в консоль, и программа это читала
Надо открыть и читать STDIN:
http://php.net/manual/ru/features.commandline.io-streams.php
http://php.net/manual/ru/wrappers.php.php
заметь что в php много функций чтения. Это
fread
fgets
file_get_contents (прочитать все данные из потока)
http://jsfiddle.net/x2quc8cw/ это явно не то, что нужно, но условия написаны непонятно.
Надо чтобы в широком окне браузера блок был не шире 600px и по центру, а в узком подстраивался под ширину окна. То есть как у тебя и сделано.
Но тут есть небольшие замечания:
Нет рамки.
> font-size: 14px;
Если пишешь font size, пиши и line height.
> max-width: 600px;
Внешняя ширина блока тогда будет 620px
У меня видимо само окно браузера меньше не сжимается независимо от содержимого, не могу проверить как и что.
http://ideone.com/vlwG0X
Убрал глобальные переменные, внедрил значение $pathDone по умолчанию, но возникла проблема. Находится только один маршрут, т.е. рекурсия работает, но функция не перебирает все варианты пути из станции. Может у меня глаз уже замылился, не могу найти причину такого поведения, несколько раз пробовал с самого начала переписать, все бестлоку.
> foreach ($paths[$point] as $station => $pathInfo) {
> ....
> return makeOneStep($paths, $time, $point, $target, $pathDone);
Посмотри внимательно. Ты берешь первую точку, рассчиытваешь маршрут через нее и выходишь из функции (return), не проверив путь через вторую, третью и т.д. точки.
Надо по другому. Надо не возвращать первый найденный маршрут , а сложить все маршруты в массив. А потом выбрать из него кратчайший и вернуть.
>Надо по другому. Надо не возвращать первый найденный маршрут , а сложить все маршруты в массив. А потом выбрать из него кратчайший и вернуть.
Наверное сейчас глупость спрошу, но как заполнить массив внутри рекурсивной функции не применяя глобальные переменные? Я эти переменные изначально для этого и использовал, сейчас идея в том чтобы возвращать маршруты из функции в массив по одному и потом с ними разбираться.
> Наверное сейчас глупость спрошу, но как заполнить массив внутри рекурсивной функции не применяя глобальные переменные?
$routes = [];
foreach (...) {
$route = findroute(....);
$routes[] = $route;
}
Такой вариант не годится?
Если объявлять массив в функции, он будет обнуляться каждый раз, если вне функции, то надо вводить дополнительный аргумент. Или это допустимо?
> Если объявлять массив в функции, он будет обнуляться каждый раз, если вне функции, то надо вводить дополнительный аргумент. Или это допустимо?
Это временный массив. Он нужен только чтобы сохранить найденные пути через соседние точки, выбрать кратчайший и вернуть. Зачем его сохранять?
загружать лучше на gist.github.com (можно хоть перетаскиванием). А если ты осилишь Github Pages то можешь даже сделать чтобы сайт в браузере можно было просмотреть: https://pages.github.com/
Попробуй пока разобраться.
Ок, подумаю.
Чтобы загрузить сайт на github pages, надо создать на гитхабе репозиторий, склонировать его к себе, добавить туда файлы и запушить на гитхаб. То есть надо пользоваться гитом. Вот тебе книжка в помощь:
http://git-scm.com/book/ru/v2/
Гит тебе все равно наверно еще пригодится.
Если что можешь вопросы задавать.
Также, вот гайд по командной строке: https://gist.github.com/codedokode/10539568
Если ты под 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 имеет свою определенную структуры каталогов и она сразу скачивается композером вместе с начальным шаблоном и лежит всё это дело в вендор, в руководстве и туторе же рассматривается случай когда всё скаченно в ручную и предлагается работать сразу со скаченными каталогами.
А что должен делать я в случае использования композера, создавать такую же структура, как та что в вендоре, но новую и просто подключать в неё yii2 никак не меняя содерживое вендор?
Разясни пожалуйста, анон.
Враппер модели, что бы переписать instantiate в CActiveRecord. Я просто наследовал и переопределил, но так ли надо было сделать?
1. Распаковать
2. Зайти в папку в терминале/консоли
3. composer update что бы скачать все что понадобится
4. все
Это мои догадки
>>451568
А вообще? С учётом того, что с погромированием знаком только по школе (сдавал ЕГЭ по информатике).
За какое время реально въехать и устроиться на работу, при условии, что относительно неглуп? ДС.
другой анон
>>451340
Это плохая идея, резать HTML регулярками. Она ведет к разным ошибкам. Нужно использовать библиотеку, понимающую структуру HTML, например DOM + XPath для вырезания.
Или можно попробовать взять более высокоуровневую библиотеку, например Symfony DomCrawler: http://symfony.com/doc/current/components/dom_crawler.html
>>451346
Ты наверно ссылку перепутал и дал то же самое что тут >>450895
>>451355
Ссылка не открывается (We seem to have missed the gist of that gist you were looking for). Могу посоветовать поставить var_dump для $_FILES и всех переменных которые исопльзуются чтобы посмотреть в чем дело. на линуксе так же может быть проблема с правами, но если ты включил отображение ошибок то увидишь сообщение.
Переработал код. Поменял названия переменных на более понятные. Избавился от лишней копипасты. Код стал чище и красивей.
Единственное, почему-то не работает во второмАнтикризисномМетоде одна строка:
https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L80
Ошибка:
Fatal error: Call to a member function setLeader() on a non-object in C:\Program Files\xampp\www\Classes\Direction.php on line 80
Вот принт $newLeader:
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] => )
Почему выдается ошибка о том что я вызываю функцию не к объекту, когда я обращаюсь именно к нему?
>>451394
Тут рамки не хватает, но ладно, можешь ее не делать, переходи к следующему заданию. И вообще не жди меня, можешь сразу несколько заданий делать дальше.
>>451407
Ты проверял свой HTML и CSS валидаторами? Проверь сам сначала:
HTML валидатор: http://validator.w3.org/#validate_by_input
CSS валидатор: http://jigsaw.w3.org/css-validator/
Твой код не обязан на 100% проходить проверку. Но для любых отступлений от стандарта должна быть причина.
Не забудь добавить DOCTYPE перед проверкой.
Вот объяснение некоторых ошибок http://htmlbook.ru/samhtml/validatsiya-dokumentov/ispravlenie-oshibok
Если что-то непонятно, пиши в тред.
Замечания:
— Нету DOCTYPE. Это значит что браузеры переключатся в режим совместимости с написанными в прошлом тысячелетии сайтами (Quirks mode) и будут отступать от стандартов при отображении страницы. Читай
http://www.webmascon.com/topics/coding/25a.asp
http://pepelsbey.net/pres/doctype/
> digital&branding
Читай про HTML сущности: http://htmlbook.ru/samhtml/tekst/spetssimvoly
Символы < > & надо писать через них. Делал ли ты 3-е задание из «Пути HTML»? Если пропустил то зря. Там все задания важны.
Кстати в Sublime эта ошибка подсвечивается красным.
> HOME</a>
заглавные буквы надо делать средствами CSS, а в тексте писать нормально.
> <p><h2>Consectetur</h2>
Нельзя ставить h2 внутрь p. Как заголовок может быть внутри абзаца текста?
> id="featuredworks"
Старайся не исплоьзовать id в верстке. Они неудобные, так как их нельзя повторно испльзовать и ставить несколько id на один элемент.
> id="imagecontainer"
В CSS обычно используют минус для разделения слов: image-container. Также тебе наверно будет интересно и полезно почитать про подход к составлению названий классов под названием БЭМ:
https://ru.bem.info/articles/bem-for-small-projects/#%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%91%D0%AD%D0%9C-%D0%B4%D0%BB%D1%8F-css
https://ru.bem.info/method/definitions/
http://frontender.info/MindBEMding/
> <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.
> font-family: 'Lato', Arial;
В конце принято писать стандартный шрифт: http://htmlbook.ru/css/font-family
> .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?
>>451394
Тут рамки не хватает, но ладно, можешь ее не делать, переходи к следующему заданию. И вообще не жди меня, можешь сразу несколько заданий делать дальше.
>>451407
Ты проверял свой HTML и CSS валидаторами? Проверь сам сначала:
HTML валидатор: http://validator.w3.org/#validate_by_input
CSS валидатор: http://jigsaw.w3.org/css-validator/
Твой код не обязан на 100% проходить проверку. Но для любых отступлений от стандарта должна быть причина.
Не забудь добавить DOCTYPE перед проверкой.
Вот объяснение некоторых ошибок http://htmlbook.ru/samhtml/validatsiya-dokumentov/ispravlenie-oshibok
Если что-то непонятно, пиши в тред.
Замечания:
— Нету DOCTYPE. Это значит что браузеры переключатся в режим совместимости с написанными в прошлом тысячелетии сайтами (Quirks mode) и будут отступать от стандартов при отображении страницы. Читай
http://www.webmascon.com/topics/coding/25a.asp
http://pepelsbey.net/pres/doctype/
> digital&branding
Читай про HTML сущности: http://htmlbook.ru/samhtml/tekst/spetssimvoly
Символы < > & надо писать через них. Делал ли ты 3-е задание из «Пути HTML»? Если пропустил то зря. Там все задания важны.
Кстати в Sublime эта ошибка подсвечивается красным.
> HOME</a>
заглавные буквы надо делать средствами CSS, а в тексте писать нормально.
> <p><h2>Consectetur</h2>
Нельзя ставить h2 внутрь p. Как заголовок может быть внутри абзаца текста?
> id="featuredworks"
Старайся не исплоьзовать id в верстке. Они неудобные, так как их нельзя повторно испльзовать и ставить несколько id на один элемент.
> id="imagecontainer"
В CSS обычно используют минус для разделения слов: image-container. Также тебе наверно будет интересно и полезно почитать про подход к составлению названий классов под названием БЭМ:
https://ru.bem.info/articles/bem-for-small-projects/#%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%91%D0%AD%D0%9C-%D0%B4%D0%BB%D1%8F-css
https://ru.bem.info/method/definitions/
http://frontender.info/MindBEMding/
> <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.
> font-family: 'Lato', Arial;
В конце принято писать стандартный шрифт: http://htmlbook.ru/css/font-family
> .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?
>>451407
> Я правда не разобрался как размер шрифта определять в псд, поэтому наверное так криво получилось.
Берешь Text tool и щелкаешь один раз на текст. На панели текста появится размер и стиль шрифта. если панель не видна, открой ее через Window - Character.
Ну и сделай чтобы макет тянулся, например от 1024 до 1600. Если экран меньше то появляется линейка прокрутки, если больше то поля с краев а сайт центрируется (для этого достаточно правильно min/max-width поставить).
>>451485
Запустить код на сервере злоумышленник может только в 3 случаях:
1) он загрузил файл с расширением котрое вызывает подключение php интерпретатора напрмиер file.php
2) он загрузил файл в котором одно из расширений это php: file.php.rar (прикольная фишка Апача, правда? с ее помощью можно обходить проверку по рсширению)
3) он загрузил .htaccess файл
Решения:
- проверка расширений файла, например если ты принимаешь только картинки то проверяй расширение на список допустимых
- не пропускаем умников пытающихся загрузить file.php.rar
- отключаем выполнение php в папке загрузок ( http://habrahabr.ru/post/61842/ )
- отключаем выполнение htaccess в папке загрузок (это можно сделать только в конфиге веб-сервера директивой http://httpd.apache.org/docs/current/mod/core.html#allowoverride )
- запрещаем загрузку htaccess файлов
- загружаем файлы на отдельный сервер где не установлен 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 кода в папке.
>>451407
> Я правда не разобрался как размер шрифта определять в псд, поэтому наверное так криво получилось.
Берешь Text tool и щелкаешь один раз на текст. На панели текста появится размер и стиль шрифта. если панель не видна, открой ее через Window - Character.
Ну и сделай чтобы макет тянулся, например от 1024 до 1600. Если экран меньше то появляется линейка прокрутки, если больше то поля с краев а сайт центрируется (для этого достаточно правильно min/max-width поставить).
>>451485
Запустить код на сервере злоумышленник может только в 3 случаях:
1) он загрузил файл с расширением котрое вызывает подключение php интерпретатора напрмиер file.php
2) он загрузил файл в котором одно из расширений это php: file.php.rar (прикольная фишка Апача, правда? с ее помощью можно обходить проверку по рсширению)
3) он загрузил .htaccess файл
Решения:
- проверка расширений файла, например если ты принимаешь только картинки то проверяй расширение на список допустимых
- не пропускаем умников пытающихся загрузить file.php.rar
- отключаем выполнение php в папке загрузок ( http://habrahabr.ru/post/61842/ )
- отключаем выполнение htaccess в папке загрузок (это можно сделать только в конфиге веб-сервера директивой http://httpd.apache.org/docs/current/mod/core.html#allowoverride )
- запрещаем загрузку htaccess файлов
- загружаем файлы на отдельный сервер где не установлен 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 кода в папке.
проверять будут не сколько ты учил, а что ты знаешь. Обычно просят сделать небольшой сайт, также могут спросить какие библиотеки и фреймворки знаешь. А сколько ты времени потратил никого особо не интересует.
Я бы рассчитывал на полгода-год вдумчивого старательного изучения.
>>451527
Content management System
>>451540
Раньше Юи нельзя было поставить через композер из-за запутанной структуры папок (фреймворк и пользовательский код были перемешаны) и старые туториалы использовали вариант когда ты руками скачиваешь и распаковываешь архив.
В новом Yii эта проблема решена. Те каталоги в которых ты кладешь свой код, делаются вне vendor.
Ты читал https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-installation.md ?
Там используется команда https://getcomposer.org/doc/03-cli.md#create-project и базовое приложение из https://github.com/yiisoft/yii2-app-basic
Композер склонирует этот проект в корневую папку, а зависимости (в том числе ядро Yii) в vendor.
Заметь что там уже нет папки protected: контроллеры лежат прямо в корневом каталоге.
> в руководстве и туторе же рассматривается случай когда всё скаченно в ручную и предлагается работать сразу со скаченными каталогами.
По моей ссылке рассматривается композер.
> А что должен делать я в случае использования композера, создавать такую же структура, как та что в вендоре, но новую и просто подключать в неё yii2 никак не меняя содерживое вендор?
делать через create-project
проверять будут не сколько ты учил, а что ты знаешь. Обычно просят сделать небольшой сайт, также могут спросить какие библиотеки и фреймворки знаешь. А сколько ты времени потратил никого особо не интересует.
Я бы рассчитывал на полгода-год вдумчивого старательного изучения.
>>451527
Content management System
>>451540
Раньше Юи нельзя было поставить через композер из-за запутанной структуры папок (фреймворк и пользовательский код были перемешаны) и старые туториалы использовали вариант когда ты руками скачиваешь и распаковываешь архив.
В новом Yii эта проблема решена. Те каталоги в которых ты кладешь свой код, делаются вне vendor.
Ты читал https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-installation.md ?
Там используется команда https://getcomposer.org/doc/03-cli.md#create-project и базовое приложение из https://github.com/yiisoft/yii2-app-basic
Композер склонирует этот проект в корневую папку, а зависимости (в том числе ядро Yii) в vendor.
Заметь что там уже нет папки protected: контроллеры лежат прямо в корневом каталоге.
> в руководстве и туторе же рассматривается случай когда всё скаченно в ручную и предлагается работать сразу со скаченными каталогами.
По моей ссылке рассматривается композер.
> А что должен делать я в случае использования композера, создавать такую же структура, как та что в вендоре, но новую и просто подключать в неё yii2 никак не меняя содерживое вендор?
делать через create-project
Неверно. Вот в мануале описано, надо делать через create-project: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-installation.md
>>451551
> Я просто наследовал и переопределил, но так ли надо было сделать?
Наверно можно.
>>451584
какие-то заголовки не скопировал. А вообще Moodle open source, можно в коде посмотреть если что.
Ну и POST можно минимум в 2 вариантах enctype передавать.
>>451225
>>451656
> objectFilter
Лучше просто filter, в SplObjectSTorage все равно кроме объектов ничего нет и получается масло масляное.
В остальном все верно.
Неверно. Вот в мануале описано, надо делать через create-project: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-installation.md
>>451551
> Я просто наследовал и переопределил, но так ли надо было сделать?
Наверно можно.
>>451584
какие-то заголовки не скопировал. А вообще Moodle open source, можно в коде посмотреть если что.
Ну и POST можно минимум в 2 вариантах enctype передавать.
>>451225
>>451656
> objectFilter
Лучше просто filter, в SplObjectSTorage все равно кроме объектов ничего нет и получается масло масляное.
В остальном все верно.
Наверно потому что
> $newLeader = reset($filteredEmployees);
может вернуть false или null в пустом массиве. А когда ты дампил он был не пуст.
По коду:
> public function getLeader() {
Возвращает массив. Что за ерунда? Функция называется getLeader, а не getLeaders, верно? Значит она не должна возвращать массив.
Да и может ли быть 2 босса в департаменте? Если да то перименуй функцию и переделай весь код который ее использует на многобоссовый режим. Если нет то возвращай один объект, а если лидеров окажется больше, выкинь какое-нибудь spl-исключение.
> public $name;
закрой свойства от прямого доступа. У тебя же много замечательных методов имеется.
> return $f->getLeader() == true;
Можно просто return $f->getLeader( ); он же true/false возвращает?
Ну и getLeader на рабочем правильнее назвать isLeader. Функции возвращающие true/false обычно называют isSomething()
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Department.php#L24
нужен тайп хинт
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Department.php#L69
Лучше всегда возвращать точное значение а округляет пусть тот кто выводит
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Department.php#L72
> public function makeEmployeesArray() {
Ты бы мог заморочиться и использовать http://php.net/manual/ru/function.iterator-to-array.php так как SplObjectStorage реализует интерфейс Traversable.
Ну и учитывая что это используется только в getLeader, от этой функции вообще можно было избавиться. Можно и оставить, впрочем.
> ?>
Не ставь это в конце
> throw new Exception('Incorrect rang');
Лучше писать тут же чему равен ранг. Тогда отлаживать ошибку будет проще. делай помогающие сообщения об ошибках.
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L5
> public function getEmployeesType($employees, $type, $leader = false)
Тайп хинт бы поставить
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L21
> public function findAndProcessWorkers($employees, callable $callback) {
Есть ведь https://php.net/manual/ru/function.array-walk.php ?
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L57
> //Повышаем зарплату и кофе определенному типу
Это лучше писать перед функцией, а не справа так как строки получаются длинные
> public function secondAnticrisisMethod(
Тут надо сделать проверки вроде: если подходящего кандидата нет, не меняем лидера
Смену лидера надо бы сделать методом в департаменте. А у тебя колхоз какой-то: вручную снимаем статус, вручную ставим.
Ты тут не используешь наследование, а вообще с помощью наследования можно было бы не указывать зарплату через коснтруктор (а прописать ее в классах Инженера, Менеджера и тд).
> firstAnticrisisMethod('engineer');
Название надо сделать константой вроде Employee::JOB_ENGINEER. А то у тебя какие-то мутные строки, легко опечататься, непонятно каке вообще профессии существуют.
По коду:
> public function getLeader() {
Возвращает массив. Что за ерунда? Функция называется getLeader, а не getLeaders, верно? Значит она не должна возвращать массив.
Да и может ли быть 2 босса в департаменте? Если да то перименуй функцию и переделай весь код который ее использует на многобоссовый режим. Если нет то возвращай один объект, а если лидеров окажется больше, выкинь какое-нибудь spl-исключение.
> public $name;
закрой свойства от прямого доступа. У тебя же много замечательных методов имеется.
> return $f->getLeader() == true;
Можно просто return $f->getLeader( ); он же true/false возвращает?
Ну и getLeader на рабочем правильнее назвать isLeader. Функции возвращающие true/false обычно называют isSomething()
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Department.php#L24
нужен тайп хинт
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Department.php#L69
Лучше всегда возвращать точное значение а округляет пусть тот кто выводит
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Department.php#L72
> public function makeEmployeesArray() {
Ты бы мог заморочиться и использовать http://php.net/manual/ru/function.iterator-to-array.php так как SplObjectStorage реализует интерфейс Traversable.
Ну и учитывая что это используется только в getLeader, от этой функции вообще можно было избавиться. Можно и оставить, впрочем.
> ?>
Не ставь это в конце
> throw new Exception('Incorrect rang');
Лучше писать тут же чему равен ранг. Тогда отлаживать ошибку будет проще. делай помогающие сообщения об ошибках.
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L5
> public function getEmployeesType($employees, $type, $leader = false)
Тайп хинт бы поставить
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L21
> public function findAndProcessWorkers($employees, callable $callback) {
Есть ведь https://php.net/manual/ru/function.array-walk.php ?
> https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L57
> //Повышаем зарплату и кофе определенному типу
Это лучше писать перед функцией, а не справа так как строки получаются длинные
> public function secondAnticrisisMethod(
Тут надо сделать проверки вроде: если подходящего кандидата нет, не меняем лидера
Смену лидера надо бы сделать методом в департаменте. А у тебя колхоз какой-то: вручную снимаем статус, вручную ставим.
Ты тут не используешь наследование, а вообще с помощью наследования можно было бы не указывать зарплату через коснтруктор (а прописать ее в классах Инженера, Менеджера и тд).
> firstAnticrisisMethod('engineer');
Название надо сделать константой вроде Employee::JOB_ENGINEER. А то у тебя какие-то мутные строки, легко опечататься, непонятно каке вообще профессии существуют.
>А когда ты дампил он был не пуст.
Не понял. Как такое могло случиться? Я не правильную функцию подобрал? reset же не совсем преднозначен для получения первого элемента. Может сделать просто $newLeader = $filteredEmployees[0]?
>>451707
>Ты бы мог заморочиться и использовать http://php.net/manual/ru/function.iterator-to-array.php
Почему ты сразу не сказал что существует такая функция? Я же сразу сказал что буду писать сам такую функцию (╯︵╰,)
> public function findAndProcessWorkers($employees, callable $callback) {
>Есть ведь https://php.net/manual/ru/function.array-walk.php ?
Я у тебя скопировал ༼ つ ◕_◕ ༽つ
>(а прописать ее в классах Инженера, Менеджера и тд).
У меня нету таких классов. Есть общий класс Department, и при добавлении сотрудника указывается все через коснтруктор. Не понял, как ты имел ввиду унаследовать чтобы избежать этого? ʃ(˘▽ƪ)
> firstAnticrisisMethod('engineer');
Название надо сделать константой вроде Employee::JOB_ENGINEER. А то у тебя какие-то мутные строки, легко опечататься, непонятно каке вообще профессии существуют.
А можно пример или подсказку как это реализовать? Не совсем понял просто. Что такое константы я, вроде, знаю, но такой метод записи вижу первый раз. (◡‿◡)
>заглавные буквы надо делать средствами CSS
Это как? Не нашел такого свойства.
>На макете «Consectetur» написано шрифтом без засечек, у тебя с засечками.
Не знаю, я использовал шрифт Lato, а там используются какие-то различные его разновидности, Lato black, Lato light.
>Надпись «Curabitur blandit tempus portitto» не такая бледная.
Я пипеткой цвет взял из макета.
Класс "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" хранит в себе объекты мышей и котов, хотя в основном оперирует их позициями. Но с другой стороны, как-то нужно удалять мышей, обновлять текущие позиции. В общем, боюсь, что наделал кучу каких-то сложностей, ОП, ткни в них носом. Заранее спасибо.
Класс "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" хранит в себе объекты мышей и котов, хотя в основном оперирует их позициями. Но с другой стороны, как-то нужно удалять мышей, обновлять текущие позиции. В общем, боюсь, что наделал кучу каких-то сложностей, ОП, ткни в них носом. Заранее спасибо.
Ну вот смотри https://www.google.ru/webhp?hl=ru&tab=ww#newwindow=1&hl=ru&q=%D0%9A%D0%BE%D1%82%D0%B8%D0%BA%D0%B8 был бы тут пост запрос - я бы не мог поделиться с тобой результатом поиска. Я уже не говорю, что с гет запросом можно всю страницу переделать в совершенно другую.
Хм, действительно. Благодарю. Но если не стоит цели делиться ссылками после запроса, то можно и не использвать ГЕТ для чистоты адресной строки?
>3 Реализация:
>3.1 IIS
>3.2 Apache
>3.3 Обработка URL в собственном скрипте
>3.4 Веб-framework
Мля, а у меня Nginx... На нем можно сделать?
http://winginx.com/ru/docs/rewrites
>Как уже знаем, в nginx не существует апачевского .htaccess, где можно было бы настроить правила для столь популярного mod_rewrite, собственно mod_rewrite — это модуль именно для Apache...
>Но не стоит расстраиваться! У nginx есть свой модуль — ngx_http_rewrite_module. По моему скромному мнению, модуль rewrite у nginx более гибок, понятен и прост в освоении, нежели mod_rewrite у Apache. Хотя, оба требуют особого понимания работы системы «ревратов» для написания правил :)
Спасибо. Выглядит сложно, придется долго курить мануалы.
На большинстве сайтов так все и выглядит обычно. К чему такая срочность? От тебя по работе это требуют? Если чисто для себя, то почему бы не выучить реализацию ЧПУ самому?
http://jsfiddle.net/a3TfX/432/
Нет, не работа, все для себя. Но учить что-то сильно специфическое и сложное, что больше никогда не пригодиться, не очень хочется. Просто я не программер, но сайт свой имею/делаю
Вопрос снимается, я решил.
> Не понял. Как такое могло случиться? Я не правильную функцию подобрал? reset же не совсем преднозначен для получения первого элемента
Если массив пустой как тебе поможет reset? Использовать [0] конечно лучше если в массиве ключи идут по порядку.
> Не понял, как ты имел ввиду унаследовать чтобы избежать этого?
$manager = new Manager($rank);
$engineer = new Engineer($rank);
> А можно пример или подсказку как это реализовать?
http://php.net/manual/ru/language.oop5.constants.php
Я советую весь раздел мануала по ООП прочитать, ты уже не совсем начинающий.
>>451767
> Не нашел такого свойства.
text-transform
> а там используются какие-то различные его разновидности, Lato black, Lato light.
дело не в этом. Посмотри инспектором в браузере верстку или посмотри что пишет валидатор.
> Я пипеткой цвет взял из макета.
есть такое понятие как анлиалисасинг ( https://ru.wikipedia.org/wiki/%D0%A1%D0%B3%D0%BB%D0%B0%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 )
Если линия буквы частично попадает в пиксель то он закрашивается лишь частично. Ты можешь увидеть это, сделав большой масштаб (например 800%) и увидишь что пиксели имеют разную яркость.
Обычно цвет можно взять из свойств текста в фотошопе, но тут шрифт тонкий и он кажется из-за этого бледнее. лучше всего подобрать цвет на глаз, там всего 256 градаций серого.
> Не понял. Как такое могло случиться? Я не правильную функцию подобрал? reset же не совсем преднозначен для получения первого элемента
Если массив пустой как тебе поможет reset? Использовать [0] конечно лучше если в массиве ключи идут по порядку.
> Не понял, как ты имел ввиду унаследовать чтобы избежать этого?
$manager = new Manager($rank);
$engineer = new Engineer($rank);
> А можно пример или подсказку как это реализовать?
http://php.net/manual/ru/language.oop5.constants.php
Я советую весь раздел мануала по ООП прочитать, ты уже не совсем начинающий.
>>451767
> Не нашел такого свойства.
text-transform
> а там используются какие-то различные его разновидности, Lato black, Lato light.
дело не в этом. Посмотри инспектором в браузере верстку или посмотри что пишет валидатор.
> Я пипеткой цвет взял из макета.
есть такое понятие как анлиалисасинг ( https://ru.wikipedia.org/wiki/%D0%A1%D0%B3%D0%BB%D0%B0%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 )
Если линия буквы частично попадает в пиксель то он закрашивается лишь частично. Ты можешь увидеть это, сделав большой масштаб (например 800%) и увидишь что пиксели имеют разную яркость.
Обычно цвет можно взять из свойств текста в фотошопе, но тут шрифт тонкий и он кажется из-за этого бледнее. лучше всего подобрать цвет на глаз, там всего 256 градаций серого.
еще надо иметь учетку разработчика в аппсторе чтоб загрузить туда свое поделие. стоит 100 баксов в год кажется
В чем смысл использовать пост? Все используют гет, а ты особенный? Просто традиционно гет испльзуется для запросов не изменяющих состояние сервера и я не вижу причины делать наоборот. Ну и ссылкой можно поделиться или сохранить в закладки, что удобно. Также можно вернуться на страницу результатов кнопкой назад. Я не понимаю почему ты хочешь лишить пользователей удобства.
Я там написал чуть позже, зачем мне это - оказалось, что необходимая мне фича называется ЧПУ.
> Мне это все не нравится, я и допустим хочу сделать красиво "test.com/слово"
Это можно сделать, редиректом например но это довлоьно бессымсленная затея. Во-первых, что если пользователь введет кроме слова еще какие-нибудь символы. Что если он введет index.php? По моему это бессмысленное усложнение которое не дает никакой выгоды.
Да и в современных браузерах часто query string параметры вообще не выводятся пока не щелкнешь по адресной строке.
Ну молодец, ты пояснил всему миру, что им не нужны ЧПУ. Выходи с плакатами на улицу, чо уж там.
Надо использовать подстановку данных через плейсхолдеры например как тут
http://php.net/manual/ru/pdo.prepared-statements.php
http://habrahabr.ru/post/137664/
Красивые URL лучше сделать для обычных страниц а не для результатов поиска. В моем понимании красивые URL это соответствующие концепциям HTTP/REST, и эти концепции не требуют результаты поиска делать отдельными страницами.
Вот например статья для начала:
http://www.artlebedev.ru/kovodstvo/sections/48/
https://ru.wikipedia.org/wiki/%D0%A7%D0%9F%D0%A3_(%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82)#.D0.9A.D0.BE.D0.BD.D1.86.D0.B5.D0.BF.D1.86.D0.B8.D1.8F_.D0.A7.D0.9F.D0.A3
Никакая форма не будет отправлять данные приписывая их к URL. ты должен либо делать это яваскриптом либо принимать запрос и редиректить.
Также ты должен продумать схему кодирования слов в URL. чтобы избежать конфиликтов и неодноначностей.
Ну и я вспомнил — некоторые сайты так делали, но они делали это ради того чтобы создать видимость что у них много страниц и занять более высокое место в поисковиках. Не уверен что этот трюк работает в наши дни.
Не понял какое отношение имеет картинка. На ней не результаты поиска. на яндексе например ссылка имеет вид
http://yandex.ru/yandsearch?lr=2&text=test
>>451963
Хорошо, я верю, что вы правы. Но тогда все равно я вижу проблему:
test.com/?search=слово&submit=
не выглядит так же красиво, как
http://yandex.ru/yandsearch?text=слово
Как привести ссылку к нормальному виду без сабмита хотя бы?
Я понял что оно в конце, я спрашиваю зачем оно там и какое у него значение?
Я почему-то думаю, что это кнопка дописывает, так как именно она у меня имеет соответствующие атрибуты. Но я не знаю, как сделать кнопку по-другому.
<button class="..." type="submit" name="submit">
Может быть дело в бутстрапе? Я использую вот этот компонент с похожим синтаксисом:
http://getbootstrap.com/components/#input-groups-buttons
Хотя в обычной форме без бустрапа я бы поставил
<input type="submit" name="submit" value="Поиск">
Но вопрос остается открытым, буду им бампать пока не поможете, лол) Я же знаю, вы догадываетесь, в чем проблема.
>>451988
Вау! А выше мне говорили совершенно другое, хотя я начал свои рассуждения именно с POSTа:
>В чем смысл использовать пост? Все используют гет, а ты особенный? Просто традиционно гет испльзуется для запросов не изменяющих состояние сервера и я не вижу причины делать наоборот. Ну и ссылкой можно поделиться или сохранить в закладки, что удобно. Также можно вернуться на страницу результатов кнопкой назад. Я не понимаю почему ты хочешь лишить пользователей удобства.
Как насчет определиться, ребят?
Как выглядит переменная сессии в Wordpress?
залетный-ньюфаг-хеллоуворлдщик
Не слушай меня, я херню несу. У тебя кроме сабмита там должно еще поле быть. Нужно делать isset на него, а не на сабмит, тогда и атрибут можно будет убрать.
Допустим у меня в форме:
<input type="text" name="search" value='значение'>
<input type="submit" value="Поиск">
А в коде у меня проверка
if (isset($_GET['search']) а не по сабмиту
удваиваю реквест
Сработало. Я тоже думал о таком варианте раньше, но с точки зрения нормального программирования listner на текстовом поле должен срабатывать каждый раз, когда ты вводишь или удаляешь один символ. А здесь разве не так? Разве не после каждого введенного символа срабатывает все, что находится
if (isset($_GET['submit'])) {
тут
}
?
Ничего не срабатывает пока ты не отправляешь форму. Пхп скрипт выполняется один раз, при заходе на страницу, потом только когда ты её обновишь. Когда жмешь сабмит, заголовки вместе с тем, что ты написал в поле отправляются на сервер и обрабатываются им и он отправляет уже новый хтмл код.
Спасибо! А если мне нужен будет нормальная интерактивность (но не в этом случае), то тогда джаваскрипт и аякс, правильно я понимаю?
Да, ты правильно понимаешь.
жамп
Это спасает только от SQL инъекции то есть подмены запроса на выгодный злоумышленнику. Можешь почитать про нее тут
https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0
https://forum.antichat.ru/thread43966.html
От других уязвимостей это не защищает. Вывод на страницу яваскрипта - это XSS и от нее надо защищаться по другому, на этапе вывода данных а не при вставке в базу. У меня есть урок по XSS
https://github.com/codedokode/pasta/blob/master/security/xss.md
> например от записи в базу джаваскрипта?
базе от жаваскрипта ни жарко ни холодно.
>>451989
Это тебе говорит анон не знающий различия GET и POST. А я знаю и советую GET для поиска.
http://handynotes.ru/2009/08/get-versus-pos.html
Только в этой статье очень странный пункт насчет аякса, я бы ему не доверял. По моему автор пишет фигню.
http://stackoverflow.com/questions/46585/when-do-you-use-post-and-when-do-you-use-get
>>451981
Попробуй тогда button заменить на input type=submit. Но по моему ты не туда свои усилия направляешь.
Это спасает только от SQL инъекции то есть подмены запроса на выгодный злоумышленнику. Можешь почитать про нее тут
https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0
https://forum.antichat.ru/thread43966.html
От других уязвимостей это не защищает. Вывод на страницу яваскрипта - это XSS и от нее надо защищаться по другому, на этапе вывода данных а не при вставке в базу. У меня есть урок по XSS
https://github.com/codedokode/pasta/blob/master/security/xss.md
> например от записи в базу джаваскрипта?
базе от жаваскрипта ни жарко ни холодно.
>>451989
Это тебе говорит анон не знающий различия GET и POST. А я знаю и советую GET для поиска.
http://handynotes.ru/2009/08/get-versus-pos.html
Только в этой статье очень странный пункт насчет аякса, я бы ему не доверял. По моему автор пишет фигню.
http://stackoverflow.com/questions/46585/when-do-you-use-post-and-when-do-you-use-get
>>451981
Попробуй тогда button заменить на input type=submit. Но по моему ты не туда свои усилия направляешь.
погуглил бы лентяша. Вордпресс не использует сессии: https://wordpress.org/support/topic/how-does-wordpress-handle-sessions-and-session-variables
Благодарю, твоя матушка - великая женщина, а сам ты молодец.
Какие замечания на этом этапе, кроме того, что кроп не работает?
https://gist.github.com/uniunicorn/cfbbdf4eb82953be2672
>проверять будут не сколько ты учил, а что ты знаешь. >Обычно просят сделать небольшой сайт, также могут >спросить какие библиотеки и фреймворки знаешь. А >сколько ты времени потратил никого особо не >интересует.
>Я бы рассчитывал на полгода-год вдумчивого ста
Так нужно будет перед этим html/css учить или нет?
>базе от жаваскрипта ни жарко ни холодно.
ну понятно, я имел ввиду от последующего вывода его ИЗ базы на страницу.
<?php for($i= 0; $i < count($results); ++$i): ?>
<?= htmlspecialchars($results, ENT_QUOTES) ?>
<?php endfor; ?>
Ни одной итерации не проходит. Хотя если вместо цикла поставить <?= htmlspecialchars($results[0], ENT_QUOTES) ?>, то выводит результат просто замечательно, как и <?= htmlspecialchars(count($results)) ?> показывает ненулевое число. Я в замешательстве.
и да, я знаю, что есть foreach, но конкретно здесь мне нужен обычный for
Неправильно скопировал сюда, вот правильный вариант:
<?php for($i= 0; $i < count($results); ++$i): ?>
<?= htmlspecialchars($results, ENT_QUOTES) ?>
<?php endfor; ?>
Да ебаный в рот. Это макака вырезает, а не я неправильно скопировал. Там в теле цикла у переменной results естественно стоят квадратные скобки с переменной "i" внутри. Почему-то здесь они просто вырезаются.
<?php for($i= 0; $i < count($results); ++$i): ?>
<?= htmlspecialchars($results, ENT_QUOTES) ?>
<?php endfor; ?>
Вот скрин.
и еще: count(...) не стоит вызывать на каждой итерации. до цикла запили что-то типа $length = count($results)
Вот это я долбоеб. Спасибо, няша! Я чуть головой не тронулся, пока думал в чем может быть проблема. Мда...
Не за что. Алсо, для перебора массивов лучше юзать foreach ($array as $key) { ... и тут работаешь с $key, который аналогичен $array[$i] }
Да, я писал чуть выше
>и да, я знаю, что есть foreach, но конкретно здесь мне нужен обычный for
Мне просто все равно нужен итератор, и чтобы не объявлять его отдельно, мне проще сделать обычный цикл.
а, ну тогда да норм.
сколько пыхой занимаешься? у меня аналогичная ошибка была полгода назад просто (с $ в скобках), заебался читать про ООП, впервые зашел в этот тред вообще
тут совсем начинающие или как?
Пару дней уже занимаюсь. Я просто раньше с джавой и сишкой работал, вот и невнимательно написал в скобках. Но вообще такие ошибки должны выдавать хоть какие-нибудь warning'и, а у меня все ок на вид было.
Мэтт Зандстра - PHP, Объекты, шаблоны и методики программирования
На самом деле книжка очень ок, но голова спустя полгода говнокодерства в процедурном стиле крайне тяжко воспринимает ООП. Хотя всю теории по классам уже знаю.
Хочу вот дочитать её, и перекатиться в какой-нибудь фреймворк с MVC парадигмой.
После хочу вкатиться во фриланс с версткой (вчера открыл задания по хтмл+ксс, сверстал сразу макет из 10ого задания, удивился что чето умею), джаваскриптом и пыхой
Мечты...
> Но вообще такие ошибки должны выдавать хоть какие-нибудь warning'и, а у меня все ок на вид было.
Они выдают, просто ты их зачем-то отключил (или не включил).
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
>Если массив пустой как тебе поможет reset?
Но он не пустой! Я распринтовал его как раз после reset.
>$manager = new Manager($rank);
>$engineer = new Engineer($rank);
Охохохоххо, ну ладно сделаю с наследованием.
google it https://ru.wikipedia.org/wiki/PhpBB
>>451775
> лучше через куки, но вот стоит ли писать id в куки, это не является угрозой для безопасности?
Лучше использовать не легкопредсказуемый id, а сложный случайный код. ты комментарии к заадче читал ?
https://github.com/codedokode/pasta/blob/master/student-list.md
>>451808
На мой взгляд схема усложненная, с лишними полями и методами.
> поле представляет собой массив [1...n^2]
Вообще необязательно делать массив.
> Также в этом классе прописаны методы, которые будут находить ортогональные клетки, возможные с текущей позиции
Вместо того чтобы делать 8 методов наверно лучше сделать один метод вроде получитьВсеВозможныеХоды().
Непонятно почему fieldSize является свойством животного. Это как? Бывают кошки с fieldSize = 10, а бывают с 12?
pricesOfSetp и possibleSteps по моему нет смысла делать полями в классе. Зачем? Они на следующем ходе становятся неактуальными, зачем их хранить?
Не очень понятно зачем массив catsPositions если координаты кошек и так хранятся в каждой кошке. Зачем дублировать?
Соответственно непонятно зачем методы работы с этими координатами.
Метод setPosition можно убрать. Координаты животного можно генерировать извне.
Мне кажется вместо 2 методов addCat/Mouse лучше сделать один а то добавив еще 10 видов животных мы устанем добавлять методы.
Непонятно зачем нужен removeDeadMouses. Они сами собой удаляться с карты не могут?
> что будет проверка пересекаются ли массивы $enemiesPositions и массив поля видимости, возвращаемый методом findVisibleField()
тут по моему незачем делать массив видимости, если есть координаты и радиус легко проверить входит точка в него или нет.
> Достаточно ли будет их убрать из массива в классе "Field" или надо придумывать что-то связанное с __destruct()?
Достаточно убрать.
> Мне не нравится, что класс "Field" хранит в себе объекты мышей и котов
Почему? Животные находятся на Карте. Значит Карта должна знать кто на ней находится.
google it https://ru.wikipedia.org/wiki/PhpBB
>>451775
> лучше через куки, но вот стоит ли писать id в куки, это не является угрозой для безопасности?
Лучше использовать не легкопредсказуемый id, а сложный случайный код. ты комментарии к заадче читал ?
https://github.com/codedokode/pasta/blob/master/student-list.md
>>451808
На мой взгляд схема усложненная, с лишними полями и методами.
> поле представляет собой массив [1...n^2]
Вообще необязательно делать массив.
> Также в этом классе прописаны методы, которые будут находить ортогональные клетки, возможные с текущей позиции
Вместо того чтобы делать 8 методов наверно лучше сделать один метод вроде получитьВсеВозможныеХоды().
Непонятно почему fieldSize является свойством животного. Это как? Бывают кошки с fieldSize = 10, а бывают с 12?
pricesOfSetp и possibleSteps по моему нет смысла делать полями в классе. Зачем? Они на следующем ходе становятся неактуальными, зачем их хранить?
Не очень понятно зачем массив catsPositions если координаты кошек и так хранятся в каждой кошке. Зачем дублировать?
Соответственно непонятно зачем методы работы с этими координатами.
Метод setPosition можно убрать. Координаты животного можно генерировать извне.
Мне кажется вместо 2 методов addCat/Mouse лучше сделать один а то добавив еще 10 видов животных мы устанем добавлять методы.
Непонятно зачем нужен removeDeadMouses. Они сами собой удаляться с карты не могут?
> что будет проверка пересекаются ли массивы $enemiesPositions и массив поля видимости, возвращаемый методом findVisibleField()
тут по моему незачем делать массив видимости, если есть координаты и радиус легко проверить входит точка в него или нет.
> Достаточно ли будет их убрать из массива в классе "Field" или надо придумывать что-то связанное с __destruct()?
Достаточно убрать.
> Мне не нравится, что класс "Field" хранит в себе объекты мышей и котов
Почему? Животные находятся на Карте. Значит Карта должна знать кто на ней находится.
также я не уверен нужно ли в Кошке хранить enemyPosition? Кошка всегда гоняется только за одной мышью или каждый ход выбирает ближайшую? Если второе то зачем хранить это свойство?
>>451849
Ох, там для знаков < > можно обычные меньше/больше использовать, а твой юникодный символ мой фаерфокс вообще как квадратик отобразил.
> NY & SF
& это спецсимвол и его надо вcтавлять как & . Аналогично с символами < и >. Это написано в примечаниях к задаче, кстати.
> <span id="heart">
Из тегов можно использовать только em по условию.
> <div id="text1">
Это плохая идея так как чтобы добавить еще 2 блока мы должны написать еще 2 правила CSS.
В самом CSS у тебя куча копипасты. Избавься от копипасты. Сделай чтобы можно было добавить любое число блоков, прижатых к верху или низу.
> width: 98%;
> margin: 1%;
Одно из значений можно не указывать, width напрмиер
> margin-top: 10px;
> margin-bottom: 10px;
Вместо того чтобы ставить margin на каждом желтом блоке проще поставить padding на синем.
Ок, тут все верно.
также я не уверен нужно ли в Кошке хранить enemyPosition? Кошка всегда гоняется только за одной мышью или каждый ход выбирает ближайшую? Если второе то зачем хранить это свойство?
>>451849
Ох, там для знаков < > можно обычные меньше/больше использовать, а твой юникодный символ мой фаерфокс вообще как квадратик отобразил.
> NY & SF
& это спецсимвол и его надо вcтавлять как & . Аналогично с символами < и >. Это написано в примечаниях к задаче, кстати.
> <span id="heart">
Из тегов можно использовать только em по условию.
> <div id="text1">
Это плохая идея так как чтобы добавить еще 2 блока мы должны написать еще 2 правила CSS.
В самом CSS у тебя куча копипасты. Избавься от копипасты. Сделай чтобы можно было добавить любое число блоков, прижатых к верху или низу.
> width: 98%;
> margin: 1%;
Одно из значений можно не указывать, width напрмиер
> margin-top: 10px;
> margin-bottom: 10px;
Вместо того чтобы ставить margin на каждом желтом блоке проще поставить padding на синем.
Ок, тут все верно.
Лучше делать роутинг на стороне php и не беспокоиться по поводу сервера.
>>451907
Если ты скопировал чей-то код то спрашивать почему он не работает надо у автора, а не у меня.
Я могу посоветовать воспользоваться отладчиком яваскрипта, который позволяет тебе остановить программу в любом месте, просмотреть и даже поменять знаечние любой переменной. Он встроен и в хром, и в Фаерфокс: http://habrahabr.ru/post/143767/
Яндекс не приукрашает адрес страницы поиска, Гугл не приукрашает. При этом например обычные страницы и разделы у них с ЧПУ.
Я не говорю, что они не нужны, я говорю что не надо переделывать URL которые генерирует форма поиска.
>>451907
Код кстати очень убогий: если игра не идет, он все равно ест под 40% CPU у меня. Надо не перерисовывать весь холст, а только изменившиеся части.
>>452000
данные отправляются на сервер только когда ты отправишь форму, пока ты вводишь буквы туда ничего не отправляется.
>>452025
> const THUMBS_URL = "http://site.local/thumbnailier/thumbs/";
Константы не для настроек. Вот скачаю я твою библиотеку. Как мне поменять адрес сайта не трогая код?
Это надо сделать в переменныех, которые например передаются в конструктор. Или вообще использовть относительные ссылки. И разумеется вынести наружу из класса.
> public static function link($imgSourcePath, $width, $height, $mode)
Эта функция не должна ничего делать с картинкой. Это же медленно. Она должна лишь создавать ссылку, а картинка генерируется при обращении по этой ссылке.
ну и у тебя есть 10 раз вызвать link() то 10 раз сгенерируется превьюшка даже если она давно уже есть на диске. Это неэффективно.
Насчет задания, я бы советовал не использовать статические методы (хотя они использованы в задании). Это была неправильная идея с моей стороны, сделать все на статических методах. лучше сделать нормально, тогда мы можем например создать 2 объекта с разными настройками.
> https://gist.github.com/uniunicorn/cfbbdf4eb82953be2672#file-crop-scale-php-L41
Непонятно почему надо делать imagecopyresampled 2 раза подряд?
> $im = imagecreatefromjpeg($imgSourcePath);
Картинки могут быть еще в PNG или GIF.
> switch ($width_source > $height_source) {
> case true:
Это заменяется на if/else
> list($width_source, $height_source) = getimagesize($imgSourcePath);
getimagesize может вернуть false вместо массива, посмотри мануал.
Яндекс не приукрашает адрес страницы поиска, Гугл не приукрашает. При этом например обычные страницы и разделы у них с ЧПУ.
Я не говорю, что они не нужны, я говорю что не надо переделывать URL которые генерирует форма поиска.
>>451907
Код кстати очень убогий: если игра не идет, он все равно ест под 40% CPU у меня. Надо не перерисовывать весь холст, а только изменившиеся части.
>>452000
данные отправляются на сервер только когда ты отправишь форму, пока ты вводишь буквы туда ничего не отправляется.
>>452025
> const THUMBS_URL = "http://site.local/thumbnailier/thumbs/";
Константы не для настроек. Вот скачаю я твою библиотеку. Как мне поменять адрес сайта не трогая код?
Это надо сделать в переменныех, которые например передаются в конструктор. Или вообще использовть относительные ссылки. И разумеется вынести наружу из класса.
> public static function link($imgSourcePath, $width, $height, $mode)
Эта функция не должна ничего делать с картинкой. Это же медленно. Она должна лишь создавать ссылку, а картинка генерируется при обращении по этой ссылке.
ну и у тебя есть 10 раз вызвать link() то 10 раз сгенерируется превьюшка даже если она давно уже есть на диске. Это неэффективно.
Насчет задания, я бы советовал не использовать статические методы (хотя они использованы в задании). Это была неправильная идея с моей стороны, сделать все на статических методах. лучше сделать нормально, тогда мы можем например создать 2 объекта с разными настройками.
> https://gist.github.com/uniunicorn/cfbbdf4eb82953be2672#file-crop-scale-php-L41
Непонятно почему надо делать imagecopyresampled 2 раза подряд?
> $im = imagecreatefromjpeg($imgSourcePath);
Картинки могут быть еще в PNG или GIF.
> switch ($width_source > $height_source) {
> case true:
Это заменяется на if/else
> list($width_source, $height_source) = getimagesize($imgSourcePath);
getimagesize может вернуть false вместо массива, посмотри мануал.
Это называется уязвимость XSS и я дал ссылку в предыдущем посте на урок по борьбе с ней: https://github.com/codedokode/pasta/blob/master/security/xss.md
Экранировать спецсимволы HTML надо при выводе данных, а не при вставке в базу.
>>452109
Вообще наследование не принципиально, хочешь - сделай, не хочешь — не делай.
> Но он не пустой! Я распринтовал его как раз после reset.
Видимо он все же был пустой или содержал не объект.
Если ты считаешь что это не так, напиши как повторить баг? что запустить?
И как тян-участиницы относятся к таким сайтам? Прояви оригинальность хотя бы немного, сделай сайт с кунами.
>Если ты считаешь что это не так, напиши как повторить баг? что запустить?
Открыть index.php
Ошибка происходит здесь: https://github.com/someApprentice/Vector-Com/blob/master/Classes/Direction.php#L80
Можешь сам закоментировать её и прямо перед этой строкой распринтовать $newLeader.
будут мне писать в лс и просить накрутить рейтинга предлагая взаменпотрогать мою бибу
> Strict standards: Only variables should be passed by reference in some-app-vector\Classes\Direction.php on line 66
У тебя это выводится? Это явно ошибка. если не выводится то значит ты зачем-то игнорируешь часть ошибок.
Также я написал в 79-й строке
> var_dump($filteredEmployees, $newLeader);
И он вывел
array (size=0)
empty
boolean false
ты сказал что массив не пустой. Но я вижу ровно противоположную картину.
Но я же принтовал его самостоятельно (через 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, вроде. Значит так по стандарту стоит.
Поставь var_dump($filteredEmployees, $newLeader); в 79 строке
Я не говорю что ты обманываешься, а что-то перепутал просто. Может код в git не выгрузил или не там вардамп поставил.
Пример именно на 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), скорее всего, унаследует все методы и параметры от Животных и Птиц. Пишу "скорее всего", потому что не уверен что это так, но ты можешь проверить это самостоятельно, но по идее должно быть так.
Ну вот поэтому мне и нужен конкретный пример реализации. Лично меня больше всего интересуют не методы, а переменные и как с ними обращаться. Например, могу ли я из созданного объекта класса Животные обратиться к переменной Крылья (хочу узнать, есть ли у конкретного животного крылья)? Также мне не очень понятно, как обращаться с этим всем в связи с БД.
С самой БД проблем нет, я вытаскиваю информацию через мапперы и единичные классы. Но теперь мне кажется, что в моем случае нужно сделать несколько управляющих классов, а я не очень догоняю, каким образом эти управляющие классы должны заполнятся из БД.
Про твой вопрос с БД, я, к сожалению, ничего не могу подсказать, но с первым вопросом постараюсь помочь.
Возьмем к примеру мой способ выше, за исключением некоторых изменений:
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
}
...
}
>могу ли я из созданного объекта класса Животные обратиться к переменной Крылья
>хочу узнать, есть ли у конкретного животного крылья
Тут ты должен сам решить к чему ты хочешь обратиться, к конкретному классу животного или к просто к классу животных. Вообще через класс Животные не логично обращаться к классу Птиц, например. Гораздо лучше поступть так:
$birds = new Birds();
print_r($birds->wings); //true
У ОПа есть уроки которые помогут тебе понять что такое ООП и как его готовить. Мне лично помогло очень сильно.
http://archive-ipq-co.narod.ru/l1/pasta.html
Про твой вопрос с БД, я, к сожалению, ничего не могу подсказать, но с первым вопросом постараюсь помочь.
Возьмем к примеру мой способ выше, за исключением некоторых изменений:
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
}
...
}
>могу ли я из созданного объекта класса Животные обратиться к переменной Крылья
>хочу узнать, есть ли у конкретного животного крылья
Тут ты должен сам решить к чему ты хочешь обратиться, к конкретному классу животного или к просто к классу животных. Вообще через класс Животные не логично обращаться к классу Птиц, например. Гораздо лучше поступть так:
$birds = new Birds();
print_r($birds->wings); //true
У ОПа есть уроки которые помогут тебе понять что такое ООП и как его готовить. Мне лично помогло очень сильно.
http://archive-ipq-co.narod.ru/l1/pasta.html
Предок ничего не должен знать про потомков. Нельзя из базового класса (Животное) обращаться к свойствам или методам определенным в наследниках и неизвестных базовому классу.
Вот тут не понятно, что делает переменная крылья в животных, хотя она должна быть только в классе птиц:
class Animals {
public $wings = false;
...
Если на первом пункте еще возникали сомнения, то вот тут $birds = new Birds(); print_r($birds->wings); уже на сто процентов стает ясно, что управляющие классы нахуй не нужны, если мы все равно будем работать с отдельными из них. Тогда возникает следующий вопрос, а зачем тогда работать с Птицами, если можно опуститься еще ниже и работать с самими Крыльями?
>>452174
>>452175
Вот это лол.
>У ОПа есть уроки которые помогут тебе понять что такое ООП и как его готовить.
Я просмотрел и как раз описаное там я знаю.
>уже на сто процентов стает ясно, что управляющие классы нахуй не нужны
Нужны, если мы не хотим по 100 раз писать один и тот же код. Например, обрати внимание что я в Классе птиц не писал параметр $legs, потому что он уже унаследовался от класса Животных.
>а зачем тогда работать с Птицами, если можно опуститься еще ниже и работать с самими Крыльями?
Это от целей твоей задачи зависит с чем тебе работать лучше.
Сейчас у меня все работает с множеством классов, которые никак не связаны. В один момент времени идет обращение к одной таблице, через некоторое время подтягиваяется информация из другой и т.п. Это все очень неудобно, и у меня возникает такое чувство, что это неправильно. Поэтому возможно стоит создать один управляющий класс "Животные" и один большой запрос с сотнями строк в результатах, который сразу же распарсить по переменным в под-классах, чтобы потом обращаться к одному из объектов большого массива Животных. Как-то так. Более конкретно тяжело что-то сказать, ведь я спрашиваю про саму идею (ну и реализацию тоже, да)...
>>452178
>Например, обрати внимание что я в Классе птиц не писал параметр $legs, потому что он уже унаследовался от класса Животных.
Но почему тогда переменная $wings не наследуется и ее нужно снова объявлять в классе Птиц?
>Это от целей твоей задачи зависит с чем тебе работать лучше.
На сколько смог, попытался объяснить в начале этого поста, что мне нужно.
Тогда сделай задачку про компанию "Вектор" в самом конце. Там как раз нужно использовать наследование. Если ты все знаешь ты её быстро сделаешь. Плюс тут тебе подскажут о твоих ошибках, и ты в дальнейшем сможешь их избежать.
>Но почему тогда переменная $wings не наследуется и ее нужно снова объявлять в классе Птиц?
Она тоже наследуется. Просто в Животных по стандарту она дает ложное значение, а в Птицах мы меняем его на истинное.
Если у тебя много таблиц со связями то может лучше не писать свою реализацию ORM а исплоьзовать готовую вроде Doctrine 2.
> Поэтому возможно стоит создать один управляющий класс "Животные" и один большой запрос с сотнями строк в результатах, который сразу же распарсить по переменным в под-классах
Ерунда какая-то. Животные в схеме DataMapper не умеют сами себя загружать из базы, это делает маппер. И никто не запрещает мапперу взять информацию из нескольких таблиц если они связаны связями, и например загрузить граф связанных объектов. Например загрузить пост сразу с комментариями (хотя имхо это довольно бесполезно так как ты только усложняешь себе жизнь разбором массивов сложной структуры).
ну и подробности конечно из тебя как из партизана на допросе приходится выпытывать.
Получается, что если объявить эту переменную в самом верхнем классе с дефолтным значением, то мы сможем к ней обращаться и получим правильное значение, если в нижнем классе точно укажем ее значение?
>>452183
Да, таблиц сейчас десяток. Я, наверное, так и сделаю - почитаю про Doctrine и попробую реализовать.
Ну вот возьмем тот пример, что ты привел - посты на сайте с комментариями. Есть ли смысл создавать один большой класс Post, который будет управлять также классом Comments? Что-то вроде этого:
class Post {
public $mainText;
...
}
сlass Comments extends Post {
public $commentsNumber;
public $commentText; //массив
public $commentLikes; //массив
...
}
>Получается, что если объявить эту переменную в самом верхнем классе с дефолтным значением, то мы сможем к ней обращаться и получим правильное значение, если в нижнем классе точно укажем ее значение?
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;
public function fly() {
//fly far away
}
...
}
$birds = new Birds();
print_r($birds->legs); //false
>Получается, что если объявить эту переменную в самом верхнем классе с дефолтным значением, то мы сможем к ней обращаться и получим правильное значение, если в нижнем классе точно укажем ее значение?
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;
public function fly() {
//fly far away
}
...
}
$birds = new Birds();
print_r($birds->legs); //false
Но мы ведь обращаемся в нижнему классу, но при этом не знаем - птица это или нет. Нам нужно узнать, есть ли у животного крылья, а не у птицы.
А у меня результат пикрелейтед. Но! Если раскомметить $newLeader->setLeader(true), то результат будет точно такой же как и у тебя. Как такое может быть?
https://github.com/someApprentice/Vector-Com
У меня тоже не получается с наследованием. Я в каждой конкретной специальности прописал в параметрах необходимые значения зарплаты, кофе и документов. И в файле создания департаментов (department.php) изменил добавления сотрудников. А при выводе почему-то все эти значения остаются пустыми.
Ты вообще что-то странное делаешь.
> сlass Comments extends Post
С какой стати Комментарий наследуется от Поста? Комментарий это улучшенный Пост? Это разные сущности и они наследоваться не должны.
И что за «нижний класс»? Это называется предо и потомок (наследник).
Что за «управляющий класс»? Ты какие-то свои термины придумываешь и всех путаешь.
>public $commentText; //массив
Непонятно почему текст комментария это массив
У меня ощущение что ты невнимательно прочел урок про работу с Бд и начал выдумывать какие-то свои странные способы.
Исплоьзуй нормальные термины. Если ты про поле wings то в наследнике оно переопределено. И если ты создаешь объект класса birds то оно имеет значение true.
>>452191
> Как такое может быть?
Посмотри на первые 2 строчки. Если раскомментить код то программа падает с ошибкой и то что дальше не выводится.
> private $salary = 500;
private поле принадлежит только одному классу (а не расшаривается между наследниками) и в каждом классе свое. То есть если ты пишешь
new Manager()
то у тебя там есть независимые друг от друга поля Manager#salary и Employee#salary. Код в Employee видит одно поле а код написанный в Manager другое (впрочем в manager кода нету).
var_dump кстати покажет что поле salary встречается 2 раза в объекте.
> const NAME = 'manager';
Еще мне не нравится переопределение константы в наследнике. По моему ощущению, это не очень правильно так как одна константа принимает разные значения в разных классах — как так? Плюс, у тебя нет способа заставить потомка определить константу.
Правильнее сделать в Employee абстрактный метод getName если надо получать профессию работника.
Или у тебя что-то другое? зачем эта константа?
А. Понял что неправильно сделал. Уже исправил.
>>452197
>Еще мне не нравится переопределение константы в наследнике.
У меня ошибка выдается о том что неизвестная константа, если её не определить в потомке.
>Плюс, у тебя нет способа заставить потомка определить константу.
>
>Правильнее сделать в Employee абстрактный метод getName если надо получать профессию работника.
А она разве не наследуется? Есть же метод: https://github.com/someApprentice/Vector-Com/blob/master/Classes/Employee.php#L37
Или все эти методы в данном случае должны быть абстрактными?
Если да, то можно ли конструктор сделать абстрактным?
>Еще мне не нравится переопределение константы в наследнике.
Ты мне советовал сделать >>451707
>Название надо сделать константой вроде Employee::JOB_ENGINEER.
Наверно, я тебя не правильно понял. Эти константы все константы названия сотрудников нужно было задать в Employee?
> Эти константы все константы названия сотрудников нужно было задать в Employee?
Было бы неплохо но в правильном ООП предок ничего не знает про своих потомков так что нет.
>Лучше делать роутинг на стороне 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/слово". Как этого добиться?
$n = new Klass ("","","", $email);
Или лучше изменить саму структуру классов и добавить наследника?
Суть в том что есть метод для вывода всего что есть в базе данных, и собственно первые три свойства это поля базы данных, поэтому передавать их как я понял не надо в этом случае. Как же правильно написать объект в этом случае?
>Сделай чтобы можно было добавить любое число блоков, прижатых к верху или низу.
если обозначить их через класс, тогда между блоками будет разное расстояние, из-за того что это блочно-строчные типы.
>И нужен ли класс департамент
Нужен или нет, это тебе уже решать. Если его не будет, ты всех работников будешь хранить в обычном массиве.
>Типа как мне видится, так и надо делать?
Да
>Красивее имхо и логичнее завести таки класс департаментов.
Определись с функционалом. Вообще, проще будет все в БД забить и с ней уже работать, связывая таблицы между собой. А так да, можно и так как ты это хотел сделать.
Вот, накидал примерно, это делается.
http://ideone.com/RNZx6g
>почему там эхается весь твой скрипт в ответах?
Не представляю. Я все на локальном апаче делаю.
>Алсо я не понимаю что за функция Worker
Конструктор класса, а имя просто такое же как и самого класса должно быть.
>Алсо я не понимаю что за функция Worker
Можешь смело менять название на __construct и ничего не изменится
>почему там эхается весь твой скрипт в ответах?
Если тебе еще интересно. Программа эхалась из за <? вначале вместо <?php. Посто настройки php разные у у меня и у ideone, но вообще, признаком хорошего тона является <?php
Ну я так и подумал что конструктор.
>>452321
Переделал и теперь ошибка в строчке:
echo $ivan->getWork()->getName();
http://ideone.com/qerOQE
Всё, вроде работает. Но все равно чет я не въезжаю пока в этот код.
особенно в конструкцию с $ivan->getWork()->getName();
Я еще понял бы что значит $ivan->getWork(); или $ivan->getName();
для наглядности можно будет написать:
$rabotaIvana = $ivan->getWork();
$nameRaboty = $rabotaIvana->getName();
Просто, мы не записываем в переменную, а сразу получаем название фирмы.
я вот этого тоже пока понять не могу. Ладно у тебя есть объект, да? Ты пишешь $обьект->метод();
тип верно?
Ну допустим сохранили в переменную результаты:
$переменная = $объект->метод();
Ок, но потом какого хрена к тому что у нас в переменно какие-то методы применимы? Там же не объект лежит? Почему можно писать так?
Почему ты думаешь, что результатом выполнения функции не может быть другой объект? В данном случае, $ivan->getWork() и возвращает объект.
А аргумент будут?
ps сильно не бей.
<?php
error_reporting(-1);
$opName = 'молодец';
$opTrueName = 'хуй';
$text = 'оп всё таки...';
$i = mt_rand(1,10);
for (echo $text; $i <= 10; $i++) {
echo "$opTrueName/n";
$score++;
}
А я уже и так и сяк и жопой об косяк его. Предыдущие задания нормально получались. Если ты ткнёшь меня еблом где я туплю, то буду благодарен.
Тебя уже ткнули.
>>for (echo $text;
Что это такое? Где ты в уроках видел такую конструкцию? Можешь пояснить зачем там echo?
Обана, охуеть! Ну и мудак! Спасибо, ребята!
Уебываю, просто блядь думал вывести её ну как раньше типа циферки и... Да да, я знаю, что кретин
Внутри скобок for нельзя использовать echo. Это странность php который почему-то не разрешает так делать. А так, твой код вполне правильный.
Потом ты изучишь функции. Если ты заменишь echo на вызов функции то все заработает.
Пока можешь заменить echo на print($text): http://ideone.com/nZy8S5
Ну и исправь там ошибку с переменной score.
Конечно не стоит. echo лучше поставить перед циклом, а создание $i внутрь:
echo ....;
for ($i = mt_rand(...); ....)
ОП, доброго времени суток.
Из всех тредов, твой мне показался наиболее дружелюбным и привлекательным.
Чуть расскажу о себе вводные данные.
Мне 22 года, ненужная вышка гуманитарий, мамка приказала, работа, не требующая особых умственных усилий. Недавно я заглянул внутрь себя и честно сказал: "Мне это все нахуй не нужно." Вспомнил детскую мечту, когда еще впервые познакомился с компьютером - стать программистом. Мне всегда нравилось возиться с пекарнями, цифровой и вычислительной техникой. Кажется, такие как я называются свитчерами - те, кто работает пока еще на своей текущей работой, но в свободное время полностью занимаются самообучением, чтобы перекатиться в другую область. Пока достаточно, собственно, что я у тебя хотел спросить: какой набор знаний необходим джуну для того, чтобы получить работу в ДС, ДС2? Я упарывался ХТМЛ, КСС, но тонуть в простой верстке я не хочу, хочу шевелить мозгами и писать код. Вот только я теперь запутался, нужно ли пхп разработчику отлично знать хтмл, ксс и чем вообще занимается этот ПХП разработчик? Сколько времени мне может потребоваться для того, чтобы понять синтаксис, изучить ООП, склепать для опыта пару простых проектов?
Сумбурно, но как смог. Жду ответа, ОПчик.
>какой набор знаний необходим джуну для того, чтобы получить работу в ДС, ДС2?
http://archive-ipq-co.narod.ru/
>Сколько времени мне может потребоваться
Индивидуально же, а так около полгода в среднем.
Не ОП, раз уж это стало важно на анонимных бордах.
http://ideone.com/cbG3D1
Первый раз про этот дист слышу просто,
это же просто подкрашенная убунту
я вот сейчас на Дебиан перешел
Вдобавок, я правильно понимаю, чтобы стать хотя бы джуном, мне необходимо уметь верстать сайты? Или достаточно в общих чертах знать хтмл ксс?
Я начал учить похапэ по книге Энди Харриса "PHP MySQL для начинающих". Он мне предложил скачать PHPTriad, потому что в его примерах нужен будет Апач, мусекуэль и интерпретатор. Я в душе не ебу как всю эту хуйню настраивать, но если я все это освою, то могу хуярить на работку?
>объясните аутисту про MVC, ООП
Это непростая задача, тем более в интернетах уже все есть (хабростатьи поищи, например). Читай больше материалов, перечитывай. Сначала по ООП потом MVC.
Котоны, нид хелп.
Вот и еще одно собеседование, которое я провел весьма достойно(не омежничал, ответил уверенно и хорошо на все вопросы, сделал практическую часть, ответил на теоретическую часть). АшЭр кивал и улыбался, Прогер сказал, что я малаца и все верно ответил\решил и вот мне сказали, что решение будет в среду максимум. Сегодня четверг, а это значит что меня в очередной раз пидорнули с вакансией. Ходить дальше думаю смысла нет, это не первый раз, а денег нет. Так вот думаю начать фрилансить помалой, но как начать? Посмотрел на одеск там какой-то пиздец, какие-то поиски в свою команду, какие-то тесты на fluent english по скайпу, какие-то требования, быть индусом\филипинцем. Как найти себе работу\подработку на пыхе? Кто фрилансит поясните нубу попонятней, плз.
На хабре видел статью, что нормальные прогеры не нужны, так как могу уйти.
Не думаю, что это про тебя, но может тебе попробовать в достойную фирму пойти, рас ты такой охуенный?
Ну, я в нормальной уже пидорнулся раз, потом еще 3 раза в компаниях попроще. В общем, уже думаю бросить всю эту хуйню. Достало.
Может позвонить и спросить у них что с тобой не так?
Рили, это самый быстрый и верный способ.
Я, когда меня в крупной фирме задинамили, так и сделал, в ответ получил какие-то ашерские сопли о том, что подобную информацию фирма не дает, и она лично не имеет права разглашать свое мнение. Интересно, что после собеседования, которое длилось в течении 2-х недель(несколько уровней тестов, тестовое задание и наконец собеседование с ашером и техническим хуйцом-спецом) я был уверен, что мои шансы больше 90%, потому как за собой ни единой промашки не нашел. А потом такой облом. Реально я как-то уже устал от стольких обломов за столь коротикий промежуток времени. А теперь еще и днищефирма меня бортанула, это уже и вовсе дно. Хочется накидаться чем-нибудь и побыть в коматозе неделю другую пока не отпустит.
Согласен, но для начала пойдет же.
Не все могут взять и собрать линух под себя. Но, когда нибудь и он перейдет на дебиан
Конкретно сейчас нет, но я уже делал подобную программу и представляю как её написать. Меня интересует именно момент с йа и я.
у меня html-шаблон отделен от php кода; в шаблоне есть две ссылки <a> с текстом "Русский" и "Английский", нажимая на которые я хочу менять значение переменной, которая в свою очередь будет подставлена в href этих ссылок. Например, мой url выглядит так - блабла.рф/?q=&lang=ru. Тыкнув по ссылке "Английский" я хочу сменить переменную lang на "en", и перейти уже по этому новому url. Как это сделать? В самом php файле я могу сформировать запрос ($data = array('q' => $searchField, 'lang' => $lang); $link = "?" . http_build_query($data);), но я не понимаю, как это подставить в шаблон.
У тебя два пути - регулярные выражения, или же самому написать небольшую функцию распознавания места в тексте. В первом варианте тебе поможет гугл, а во втором логика простая - проверяешь символы вокруг твоего "я", и если там с обеих сторон пробел или пунктуация, то это отдельное слово "я".
Смотри как работают шаблонизаторы.
Сделай функцию которая будет принимать массив данных для шаблона и его название, а на выходе валидный htmlвнутри просто заменяй {{имя_переменной}} на значение этой переменной из переданного массива. А вообще, просто используй уже готовые шаблонизаторы.
Анончик, скажи, а ты с нуля изучал? Или у тебя уже был опыт в сфере ИТ и какие-то проекты на пыхе?
1)Днофирма
ашер: пара вопросов, кто такой , почему ИТ, какой опыт.
тех-хуец: все по книжке шевченко, я серьезно.
2)Крутая фирма
ашер: типичные ебанутые ашерские вопросы, симтуационные вопросы, о будущем. о прошлом, о коллегах, ла-ла-ла, прочий несуразный бред за который хочется просто послать всех их с фирмой нахуй, но я держался достойно, отвечал лаконично. красиво и вдумчиво. пояснял свою мысль. дополнял аргументами.
Спец-хуец: пыха, сикуел, жиквери, жиэс, все до мелочей, какие-то практические задачки на пыху(фуфло а не задачки), на сикуел запросы(посложнее), на жиквери(среднячок и крутые). В общем, подозрение, что на крутой меня ашер бортанула, может потому что я слишком уверенно себя вел(шутил, но уместно, пипл смеялся, чувствовал себя раскованно, отвечал смело и широко). Х3. Но на днофирме почему - не знаю.
С нуля, опыт небольшой есть, хочу устроиться в фирму, чтобы стать оче-уверенным разрабом. Хотя бы пару лет побатрачить, потом может и на фриланс, хотя вряд ли - я слишком ленив, боюсь самоконтроля не хватит.
>может потому что я слишком уверенно себя вел(шутил, но уместно, пипл смеялся, чувствовал себя раскованно, отвечал смело и широко)
this, но это лишь мое мнение.
Больше нет никаких вариантов, раз ты все ответил. Даже странно что бортанули.
Но, может много денег просил?
>денег много просил
Нет, посмотрел статистику за текущий год и взял чуть меньше среднего. Пояснил, что готов поработать за меньшую сумму чем оклад на испытательном сроке.
Я прочитал обе статьи (оповскую и ту, на которую оповская ссылается), но с их помощью у меня не выходит решить свою проблему. Если бы мог самостоятельно, то не писал бы сюда... А использование сторонних шаблонизаторов мне кажется не очень правильным в страничке на 10 строк.
Может кто-то поможет написать правильно эту строку в шаблоне <?= '<a href="/?' . htmlspecialchars($link, ENT_QUOTES) . '"></a>' ?>, чтобы она еще и переменную $lang как-то могла изменять?
>Пояснил, что готов поработать за меньшую сумму чем оклад на испытательном сроке.
Вот так пришел и пояснил?
Мне казалось, что наоборот, надо пояснять что бы работать на испытательном строке за полный оклад.
Ты просто шокировал их своей уверенностью.
Как много времени ты потратил на изучение пыхи и пришел к решению поиска работы? И какими навыками ты уже обладал до обучения?
Лол? Сейчас перезагрузил скрипт и у меня как раз выпало "Всё таки Хуй!". "Всё таки Хуй!" даже чаще выпадает чем "Всё таки молодец".
До обучения хтмл и ксс, потом начал здесь читать тред, кажется с 13-го, потом начал практиковаться сам - гиты-хуиты, линуксы-хуинуксы, вп-хп, мвц-хуимц и прочая.
Но, не сидеть же омежным чуханом. Они ищут сотрудника - я говорю, вот Я сотрудник, я БУДУ работать, я СМОГУ\СДЕЛАЮ. или обычно ищут: ну-хуего-никогда-не-работал-може-получится
1. Размещай шаблон в имя_шаблона.tpl.
2. Пиши напиши свой шаблонизатор.
3. Используй его.
<a href="/?lang={{lang}}">{{lang}}</a>
Вот так будет выглядеть твой шаблон.
С помощью регулярки ищи все {{набор символов}} совпадения и в цикле обрабатывай их, заменяя на необходимые тебе значения.
Все.
Нет, просто, чтобы быть в теме, знать как устроено и сверстать. что-либо, если потребуется, хотя, если честно мне не очень нравится верстка - нудно. Я для себя бутстрап открыл и подсел.
Вряд ли мы сейчас придем к какому либо выводу, так как не знаем в чем проблема.
Пробуй еще, ходи на собеседования. Но главное - узнай как то в чем проблема.
На собеседовании обычно не тычут лицом в ошибки, а лишь кивают. Может ты ошибся просто?
Сколько хтмл ксс учил? Не посылай меня нахуй, сам в подобном положении нахожусь, примеряюсь.
Но, я ведь придя домой первым делом полез курить маны по тем вопросам, где я не был уверен на 100% и оказалось, что был прав. Да и вряд ли тебе скажут - ВСЕ ВЕРНО, МАЛАЦА, если ты ошибся или я чего-то не понимаю в современном мире.
Иди еще пробуй.
Долго, месяцев 4-5, потому как вечером после работы и не каждый день. Так-то теперь я согласен, что его можно на ять за месяц осилить не напрягаясь.
А, нет, епта. Глянул у меня там ошибка какая-то со score. Я её не заметил, всё вроде нормально работает.
Это слишком сложно. Я хотел сделать это обычными методами, теми, которые советует ОП. По его словам, писать свой шаблонизатор не нужно, и я с ним согласен - на тестовой страничке этого делать явно не стоит. Должен же быть способ сделать это проще.
А, нужно было изначально присвоить значение переменной = 0.
http://ideone.com/rmWHi8
Как сократить код? Пишу как в примере - выдает ошибку, пришлось задать переменные.
Хорошо, но ответь пожалуйста на последний вопрос: без использования стороннего шаблонизатора или же написания своего, используя способы ОПа сделать ссылку, которая записывает данные в переменную, невозможно?
О, круто, я новичок, а уже могу давать советы.
Дай оригинальный код, а то это - какая то индусская вермишель.
Ну вот тебе пример того, что советует ОП (и другие тоже, ага):
<html>
<p>Привет, <?=$this->e($this->name)?>! Тебе <?=$this->e($this->age)?> лет.</p>
</html>
Взято отсюда http://www.phpinfo.su/articles/practice/shablony_v_php_chast_2.html
По такому принципу у меня и работает отдельный шаблон. Но вот теперь я застрял.
http://ideone.com/rmWHi8 - мой код с придуманными костылями.
http://archive-ipq-co.narod.ru/l1/variables.html - здесь код ОПа.
http://ideone.com/vbhu63
Так тебе надо было сократить?
>>452518
Это я ему твое сообщение отправил.
Так проблема в том, что ты неправильно переписал Гениальный Код Опа. А ты хотел чтобы за тебя просто всё решили.
http://ideone.com/0VGveA
хз, у меня ничего не выдает ошибку. Ты показывай сразу код который её выдает.
А какая ошибка то была?
У меня было свое решение - оно работало.
Просто я сначала писал вот такую хуету:
mt_rand($1, $2)
Отсюда и ошибка.
Так то не шаблонизатор, а просто htmlspecialchars
http://www.php.su/functions/?htmlspecialchars
А я и не говорил, что это шаблонизатор. Я говорил, что у меня html-"шаблон" отделен от основного кода. Правда теперь я не знаю, как работать с url в таком случае.
Сейчас сделаю.
http://rghost.ru/7VzdkM8Tw переделал. Извиняюсь за ргхост, с гитхабом еще не разбирался.
>У тебя на кнопке See portfolio активна только надпись, а кликать по краям бесполезно
Вот это я не смог сделать. С кнопками соц-сетей получилось, а с этой нет, я когда делаю height 100% на ссылку, она становится больше родителя почему-то. Я уже и inline-block на родителя ставил, и в пикселях значение подбирал - не помогло. Еще я не пойму, почему когда я задаю, допустим, margin-top для одного строчно-блочного элемента, то вниз сдвигается и соседний с ним?
Сыграйте в мою веселую рулетку, я старался:
http://ideone.com/z1hrJV
Если учесть, что пользовался только тем материалом, который дал ОП в своем учебнике - норм? Как можно сократить этот код?
Хм, странно, там теперь вместо монитора второй андроид, хотя до этого все работало. Внезапно ксс стал кейс-сенсетив и стиль не применился, потому-что я обращался к нему с маленькой буквы. Вот исправленная версия http://rghost.ru/6zhRD4mCj
Небольшие изменения внес.
Хоспаде, первый день штолесука. Вообще, лично я поклонник switch для подобных целей, как-то наглядней смотрится + ты бы хоть кнопку пуска запили и какой-то сопроводительный заголовок, а то вообще днищерулетка получилась.
Да, первый час даже.
https://gist.github.com/anonymous/a66242a8ceba1a764d79
Вот два файла. Сейчас ссылки работают и даже создают правильный url.
Но! Мне нужно, чтобы не просто url писался строкой, а туда подставлялась переменная $lang, которая задавалась в зависимости от ссылки, которую выбираешь. Кликнул на "Русский" - переменная $lang стала "ru" и ушла в url, кликнул на "Английский" - переменная стала "en" и ушла в url. И также у меня почему-то в форме не срабатывает подставление $lang.
Может просто пришел кандидат который был лучше по соотношению цена/знания? Или например они хотели человека с опытом и боятся брать без опыта? тут может быть 100500 причин.
Ну и может быть даже какой-то дикий вариант что они хотят поменять своих сотруников на таких же, но более низкооплачиваемых, пользуясь ситуацией на рынке, кто их знает.
Насчет фриланса, есть еще такая вещь как постоянная удаленная работа, выгода в том что не надо тратить время на поиск заказчиков, переговоры.
Там будет урок про массивы, в нем ты изучишь как этот код работает.
>>452539
Норм. Сократить можно через массив.
>>452536
> >У тебя на кнопке See portfolio активна только надпись, а кликать по краям бесполезно
> Вот это я не смог сделать
А ты решал предыдущие задания? Если нет то надо их сначала решить чтобы разобраться с особенностями разных элементов и свойств. Те кто пропускают первые уроки и берутся сразу за сложные, разумеется путаются.
Ссылка по умолчанию инлайн элемент и для них нельзя задать ни высоту, ни ширину.
> я когда делаю height 100% на ссылку, она становится больше родителя
Может у тебя паддинг там есть. Ты блочную модель изучал? height это внутренняя высота элемента или наружная?
> Еще я не пойму, почему когда я задаю, допустим, margin-top для одного строчно-блочного элемента, то вниз сдвигается и соседний с ним?
Можешь на jsfiddle сделать пример? Так, виновато может быть вертикальное выравнивание или еще что-то.
>>452540
> Внезапно ксс стал кейс-сенсетив
Имена классов и id по моему чувствительны к регистру.
Там будет урок про массивы, в нем ты изучишь как этот код работает.
>>452539
Норм. Сократить можно через массив.
>>452536
> >У тебя на кнопке See portfolio активна только надпись, а кликать по краям бесполезно
> Вот это я не смог сделать
А ты решал предыдущие задания? Если нет то надо их сначала решить чтобы разобраться с особенностями разных элементов и свойств. Те кто пропускают первые уроки и берутся сразу за сложные, разумеется путаются.
Ссылка по умолчанию инлайн элемент и для них нельзя задать ни высоту, ни ширину.
> я когда делаю height 100% на ссылку, она становится больше родителя
Может у тебя паддинг там есть. Ты блочную модель изучал? height это внутренняя высота элемента или наружная?
> Еще я не пойму, почему когда я задаю, допустим, margin-top для одного строчно-блочного элемента, то вниз сдвигается и соседний с ним?
Можешь на jsfiddle сделать пример? Так, виновато может быть вертикальное выравнивание или еще что-то.
>>452540
> Внезапно ксс стал кейс-сенсетив
Имена классов и id по моему чувствительны к регистру.
Я все задания выполнял так-то по порядку. Ссылку сделал блочным элементом, дело не в этом.
>Можешь на 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.
Также я советую прочесть, если ты еще не читал, эти страницы мануала:
http://php.net/manual/ru/language.variables.external.php
https://php.net/manual/ru/tutorial.forms.php
Прочти их, если не читал, посмотри что выводит 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; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
> Мне нужно, чтобы не просто 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.
Также я советую прочесть, если ты еще не читал, эти страницы мануала:
http://php.net/manual/ru/language.variables.external.php
https://php.net/manual/ru/tutorial.forms.php
Прочти их, если не читал, посмотри что выводит 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 году?
>>452554
ОП. Не понял вопрос.
>>452490
И даже мои задания из «Пути HTML» нудные? (((
По моему в верстке есть интересные вещи. Например то, что ты можешь с ее помощью делать страницы, которые тянутся в ширину и не ломаются от смены размера шрифта. Ну и с возможностями CSS3 можно делать всякие интересные вещи. Вот например что можно сделать одним дивом: http://habrahabr.ru/company/paysto/blog/251933/
Не исключаю конечно что не всем это нравится. Но мне изучать особенности CSS в свое время было интересно.
>>452488
> Пиши напиши свой шаблонизатор.
Это очень плохая идея. Почитай http://habrahabr.ru/post/230737/
> С помощью регулярки ищи все {{набор символов}} совпадения и в цикле обрабатывай их,
А ифы и циклы? А вызовы методов? Я сталкивался в одной платной CMS с таким шаблонизатором, и очень хотелось побить автора что изобрел кривой неудобный велосипед вместо использования нативного php или того же twig. Шаблонизатор был настолько плохой что многие вещи пришлось делать яваскриптом, например переводя даты в нужный формат уже после загрузки страницы вместо того чтобы сразу вывести их как нужно.
>>452474
Ему не шаблонизатор нужен.
>>452471
> Тыкнув по ссылке "Английский" я хочу сменить переменную lang на "en", и перейти уже по этому новому url.
Тебе надо в href у этой ссылки выводить нужный URL с нужными параметрами. То есть ты должен там выводить что-то вроде:
index.php?lang=en
>>452554
ОП. Не понял вопрос.
>>452490
И даже мои задания из «Пути HTML» нудные? (((
По моему в верстке есть интересные вещи. Например то, что ты можешь с ее помощью делать страницы, которые тянутся в ширину и не ломаются от смены размера шрифта. Ну и с возможностями CSS3 можно делать всякие интересные вещи. Вот например что можно сделать одним дивом: http://habrahabr.ru/company/paysto/blog/251933/
Не исключаю конечно что не всем это нравится. Но мне изучать особенности CSS в свое время было интересно.
>>452488
> Пиши напиши свой шаблонизатор.
Это очень плохая идея. Почитай http://habrahabr.ru/post/230737/
> С помощью регулярки ищи все {{набор символов}} совпадения и в цикле обрабатывай их,
А ифы и циклы? А вызовы методов? Я сталкивался в одной платной CMS с таким шаблонизатором, и очень хотелось побить автора что изобрел кривой неудобный велосипед вместо использования нативного php или того же twig. Шаблонизатор был настолько плохой что многие вещи пришлось делать яваскриптом, например переводя даты в нужный формат уже после загрузки страницы вместо того чтобы сразу вывести их как нужно.
>>452474
Ему не шаблонизатор нужен.
>>452471
> Тыкнув по ссылке "Английский" я хочу сменить переменную lang на "en", и перейти уже по этому новому url.
Тебе надо в href у этой ссылки выводить нужный URL с нужными параметрами. То есть ты должен там выводить что-то вроде:
index.php?lang=en
Спасибо, ОПушка. С вардампом до меня дошло, что происходит и половина вопроса решилась - в коде я просто делаю вот это $lang = $_GET['lang'], а на страничке в каждой ссылке вот это href="/?q=' . htmlspecialchars($searchField, ENT_QUOTES) . '&lang=en" и у меня все срабатывает! И переменная записана, и ссылка теперь правильная.
Остался второй вопрос - про использование языка во время отправки формы.
>А ты ее туда поставляешь? Я не вижу в форме поля с именем lang, я вижу только поле text. Следовательно при отправке формы на сервер будет передано только значение text.
Получается, что нужно создать скрытое поле, если я не хочу еще один input с выбором языка?
Насчет ошибок - да, все норм.
Ну МайАдмин-то нужен? Или без него можно/следует обойтись? Я только начинаю курить.
Благодарю.
> я не понимаю, как это подставить в шаблон.
В шаблоне пишешь
href="<?= html($link) ?>"
>>452442
Сначала регуляркой заменить все отдельно стоящие я на ja, и останутся только буквы внутри слов.
>>452343
Windows, Cygwin + debian в виртуалке.
Debian хорошая ОС, но меня напрягает что софт там очень стабильный, то есть старый. PHP старый, lxc старый глючный, emscripten без плясок не установишь.
Пикрелейтед показывает как это выглядит.
Когда подставляешь текст в ссылку надо кодировать его процентным кодированием ( https://ru.wikipedia.org/wiki/URL#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_URL ) функцией urlencode либо исплоьзовать http_build_url:
a=<?= htmlspecialchars(urlencode(....), ...) ?>
> Получается, что нужно создать скрытое поле
да
>>452576
Начинающему лучше осваивать консоль. Ну и вместо phpmyadmin мне больше нравится adminer.
>>452568
Это потому что по умолчанию у inline block стоит vertical-align: baseline. Почитай про это своство
http://htmlbook.ru/css/vertical-align
http://htmlbook.ru/samlayout/blochnaya-verstka/strochno-blochnye-elementy
http://web-standards.ru/articles/vertical-align/
И вот эту прекрасную статью
http://css-live.ru/articles/ikf-vertikalnoe-vyravnivanie-v-stroke-chast-1-8-ya-publikaciya-cikla-tajny-css2-1%E2%80%B3.html
Когда подставляешь текст в ссылку надо кодировать его процентным кодированием ( https://ru.wikipedia.org/wiki/URL#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_URL ) функцией urlencode либо исплоьзовать http_build_url:
a=<?= htmlspecialchars(urlencode(....), ...) ?>
> Получается, что нужно создать скрытое поле
да
>>452576
Начинающему лучше осваивать консоль. Ну и вместо phpmyadmin мне больше нравится adminer.
>>452568
Это потому что по умолчанию у inline block стоит vertical-align: baseline. Почитай про это своство
http://htmlbook.ru/css/vertical-align
http://htmlbook.ru/samlayout/blochnaya-verstka/strochno-blochnye-elementy
http://web-standards.ru/articles/vertical-align/
И вот эту прекрасную статью
http://css-live.ru/articles/ikf-vertikalnoe-vyravnivanie-v-stroke-chast-1-8-ya-publikaciya-cikla-tajny-css2-1%E2%80%B3.html
Спасибо, теперь все встало на свои места. Кстати, я там еще один косяк заметил у себя, так что вот финальный вариант
http://rghost.ru/6gb8tVWKC
Спасибо, няшка, все получилось с этими полями lang. Теперь все красиво переключается и форма отправляет из скрытого поля необходимое значение.
Пожалуйста, посмотри и укажи, как этот код можно сделать еще проще?
http://ideone.com/imzsjD
Я не ОП, но можешь фигурные скобки из строк в echo убратьЕсли они там не для удобства, конечно.
http://ideone.com/HJNZhk
Еще раз проверил - слова через раз генерируются, в чем проблема? Догадываюсь, что в mt_rand, но не могу понять.
Смотри ошибки, там внизу они написаны. У тебя типичная ошибка для все начинающих работать с массивами.
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. Смотри на ошибки внизу, это тебе поможет в будущем видеть в чем проблема и на какой конкретно строке.
http://ideone.com/pb66Ge
Вот так чели? Но ведь все равно это галимый говнокод у меня получился, ведь как-то рациональнее все можно сделать. Я правильно делаю, что начинаю отсчет с нулевого элемента в mt_rand?
Теперь все нормально.
Можешь все свои массивы слов загнать в один многомерный массив и написать функцию, которая будет проходить по вложенным массивам и извлекать необходимое количество слов в нужный момент и ставить в нужное место. Вот тебе будет уже не говнокод, а интересное решение, заодно с функциями\циклами познакомишься.
мимо-хуй-полгода-стаж-пыхи
объясните как разбирается этот объект из объектов?
http://ideone.com/1aak06
Помогите мне присвоить значение $symbol1 и $symbol2 таким образом, чтобы символ1 сначала брал 1 символ в строке, а символ 2 брал последний символ в строке. Изломал свою чекалдушку, не хочу от такой формы записи уходить.
>$symbol2 = mb_substr($text2, $i, -1);
Там нужно -$i, а не минус 1.
Последняя цифра это сколько символов ты хочешь взять из строки, там не нужен минус. А там где переменная, это с какой позиции ты хочешь взять букву. Если она будет отрицательная, то буквы будут браться с конца.
я делал и -$i и пробовал (0-$i). Попробуй запустить скрипт - нихуя буквы не совпадают.
Бля, я понял, что он возвращает сначала 1 элемент, потом последний, а они одинаковые. Как сделать так, чтобы он сразу вернул именно последний элемент. Выражение -1+$i - Хуета, не сработает
Пиздец, я затупок, спасибо.
777 права тоже пытался ставить. Правда я это все не через консольку делаю.
http://pastebin.com/M9Lgwfbc
http://pastebin.com/MeqEash2
не могу понять как его дальше разбирать?
как получить количество фото в альбоме(его нам сам вк считает)
и как вывести ссылки пакетами(там одно фото в разных размерах)
нее...
это я умею.
я не могу вывести количество.
и не могу вывести ссылки группами типа:
фото1 : перевивью
малая
большая
очень большая
огромная.
Ето для примера.
>количество
echo(count(json_decode($json)->response));
>группами
Нахуя ты тупа полез, если не можешь в циклы?
Бля, ОП распинается, пытается вас чему то научить, но нет, будем жрать говно.
Башка раскалывается нахуй от твоей задачи.
http://ideone.com/mRQoZY
Направь меня, пожалуйста.
Если кто знает, это задача про ебучий айпад.
Ох, лол. Ты напомнил как я сам начинал и охеревал с этой задачи, а еще от моего разленившегося мозга, который не мог тукаю хуиту простую сделать с наскока. Чем помощь? Сначала набросай схему работы(что за чем, и когда, и если) программы, а потом лишь начинай описывать ее реализацию. Поверь, так сразу напишешь.
Извини, но тебе не стоит этого делать. Сам не сделаешь - не научишься.
Реши задачу математически. Потом рисуй схему, где в манере развилок(гипертестов\вилок или как это назвать) выводи действия - типа : сделал действие1->сделал2-> повторил действие1 else действие2->действие1->действие3. Ну ты понел. В общем, не сдавайся, соберись, подумай, сделай перерыв на какое-нибудь развлечение и продолжай. Нельзя на начальном этапе пользовать готовыми решениями, это пагубно сказывается на усвоении информации. Главное алгоритм(скелет проги), потом уже реализация. Если есть алгоритм - написать вопрос вообще не стоит, ты ведь уже знаешь, что ты хочешь получить и когда. Добра.
Спасибо за совет.
Ебучий нуб опять на связи.
http://ideone.com/QRAk3Q
Мучал-мучал код, взгляните, ткните еблом меня, что не так делаю? В правильном направлении иду хотя бы?
$field = "`".str_replace("`","``",$_GET['field'])."`";
Будет довольно напряжно
Бамп реквесту. Голова пока отдыхает, жду ваших советов.
Спасибо, анончик, точно.
Создай php файл и пиши туда без html - только php
Устаревший подход к написанию кода. ООП вообще нету, все чисто на процедурках. Многие вещи придется переучивать. Я сам с этой книжки начинал, не сказал бы, что зря потратил время, полезным вещам тоже научился, но учебник ОПа + официальная документация реально будет полезнее.
Ничего сказать не могу насчет других книг, я читал только Никсона и Оповский учебник.
По этим видеоурокам кто-то занимался? Хорошие?
Прочитал http://php.net/manual/ru/language.oop5.typehinting.php
И там написано что нельзя проверять на простые типы как: int, bool и так далее. А я как раз делаю конструктор сотрудника и хочу что бы туда сразу передавался его ранг в виде int и то, начальник он нет, в виде bool.
А еще вот такой затуп. Например у меня будет человек повышаться в ранге. Соответственно нужно делать 2 переменных под зарплату? Что бы в первой хранить зарплату по умолчанию для всех, а во второй хранить зарплату текущую, в зависимости от ранга?
Спасибо, пока отложу это. Нужно судя по этим функциям делать доп проверку внутри моей функции с их участием, а я хотел супер элегантно в духе:
function count(array $array) {
return count($array);
}
Алсо ты можешь помочь по задаче с вектором? У меня куча вопросов, а если я буду ОП-а ждать, то не буду код писать.
В общем как я понимаю родитель не знает о данных своих наследников? Могу я составить конструктор в родительском классе, и использовать в нем данные наследников?
И вот еще вопрос: Если у сотружников в зависимости от ранга или лидерства меняются параметры, то мне в конструкторе это дело по хардкору настраивать лучше? Или просто потом сделать функции которые будут это дело сразу высчитывать в процессе?
>Могу я составить конструктор в родительском классе, и использовать в нем данные наследников?
Вроде да, почему бы и нет?
Спасибо, вроде бы работает: http://ideone.com/jKnvgR
Оказывается просто тогда не должно быть в родительском классе таких же полей как в наследниках, тогда конструктор лезет сразу в поля наследника.
в общем, что-то вроде интерфейса настройки роутеров
авторизацию, думаю, сделаю через веб сервер, а вот по всему остальному куда копать?
За эти не знаю, но рекомендую на русракере поискать видеокурсы Специалист. они там были еще недавно, 20 гектар или коло того, но тебя интересует пыха, там 4 курса лекций бауманки, где для нубаса самый смак - вдумчиво и пережевывая подается док с пхп,нет. Есть лабы, я их делал по ходу, рекомендую делать. Сначал про процедурку и кодинг в целом, потом и к ооп подводят и идут по ооп. Я считаю что для нубаса очень годные курсы несмотря на дату выпуска. алсо, пока писал уже и загуглил - вот новый курс http://rutracker.org/forum/viewtopic.php?t=4620353 за 2013, не знаю не смотрел, ща качну гляну что там. А вот старый походу потерли, не могу найти.
Ага, ты хоть пыхапэнет почитай чтоле. Это называется наследование, вызываешь через парент:: конструктор родителя, потом дописываешь хуиту наследника, ололо все работает. Ну, серьезно, начинай читать мануал, он годный, базарю.
О, а мне дико понравилось разбирать на лету урлки и собирать\вызывать контроллеры\экшены.
Спасибо, качну-гляну. Но, имхо, в курсах от Специалиста оче много воды, слишком уж сильно разжёвывают.
Был опыт, когда хтмл/цсс ковырял. На 4-м уроке моё терпение лопнуло и я скачал интенсив от хтмлакадеми.
Смени формат файла на .php
Нормально знаю ООП, могу писать в этом стиле, понимаю принцип mvc (но особо не работал с ним), естественно все дифолтные задачи на выборки/добавление етс могу сделать на php+mysql, помимо этого знаю более менее js и jquery.
Но блять, заходя на фриланс сайты и пытаясь что-то там найти, я нахожу кучу проектов по доработке сайтов на джумле/вордпрессе (второе преобладает) + написание плагинов для них, и тут я в ступоре.
1) Как научиться делать эту парашу, что почитать? И насколько много потребуется времени, учитывая что знаю описанное выше?
2) Что больше всего я не могу понять -- допустим у чувака интернет магазин на какой-то cms-ке, у него там в корзине какие-то поля есть, он просит добавить, например, выбор цвета для товара/добавить новые поля/еще какая-то параша которая, как я понимаю, связана с работой с бд. Но как это сделать? Лезть в скрипт той же корзины, искать где там добавление товара в базу, предварительно добавлять в базу еще одно поле (если чуваку цвет нужен например), и добавлять? Это какой-то неебически-мазахисткий способ, можно сдохнуть. Анон, надеюсь я ошибаюсь и есть другие способы? Поясни, пожалуйста.
В целом вообще не понимаю, как работать с БД и вносить поправки в скрипты в этих ебаных CMS.
Алсо, если есть какой-то путь, что почитать/посмотреть, чтобы по итогам не задавать вопросы на дваче а уже самому ответить на вопросы выше -- подскажи, добрый анон. Заранее спасибо<3
Так у тебя опыт работы реальной есть в какой-нибудь самой задрипанной конторе хотя бы? Имхо простейший способ начать зарабатывать на фрилансе - это устроиться куда-то джуном или хоть кем, поработать несколько месяцев, что бы руку набить, и после этого уже смотреть, можешь ли ты этим фрилансить. В любой конторе будет КАКОЙ-ТО КОНКРЕТНЫЙ СТЕК ТЕХНОЛОГИЙ если это натягиватели дизайна а джумлу или друпал, то ты прокачаешься там в этом, если ебашители на yii, simfony... ets, то в том. И далее ты просто ищешь на этом самом фрилансе, то что ты УЖЕ УМЕЕШЬ ну плюс минус какая-нибудь хуйня, которую можно в процессе освоить. В общем это лишь имхо теоретика, но так как сейчас у нас глубокая ночь и нас тут всего двое, то почему бы и не ответить.
>Ок, переходи ко второй задаче про вектор.
Вот, прошу оценить код третьей задачи на ООП.
http://ideone.com/jKnvgR
От копипасты постарался избавиться в зародыше: сначала у меня были одинаковые функции для подсчета кофе, зарплаты и документов для депертаментов и фирмы в целом - переделал в одну с пареметром. Надеюсь я правильно понял суть.
так сервер вк из уже посчитал и вернул согласно документации...
вот как это значение получить?
http://ideone.com/VvdK1k
Где я обосрался? Дайте какую-нибудь подсказку, пожалуйста. Я не прошу делать за меня.
Задача на ебучий айпад если что.
Я придумал, над каким проектом я буду работать пока буду изучать PHP. Я упарываюсь велосипедами и решил разработать сайт этой тематики: информация о всех велосипедах - новинках, моделях прошлого, информацией об аксессуарах и т.д. Прикинул стек, который мне для этого нужен: html, css, макет простенький набросать, php, JS, MySQL. Когда мне удастся с нуля запустить этот проект на хостинге, могу ли я расчитывать на получение работы джуном в ДС2 например?
http://ideone.com/cVUMEs
Задача на айпад школьнуку. Не могу понять, что делаю не так, где загвоздка в цикле.
Так ты не решал предыдущую задачу про кредит? Зачем же перепрыгивать на более сложные задачи, не решив перед этим задачу попроще?
if($totalCredit < $monthPay){
\t\t\tbreak;
\t\t}
Бессмысленная конструкция. Если оставшийся кредит меньше ежемесячной выплаты мы просто прекращаем платить? Банк простит нам оставшийся долг? Что за переменная $total? Она вообще нигде не используется.
Попробовал снова установить изменив папку:
composer create-project --prefer-dist yiisoft/yii2-app-basic domains\localhost но выдает ошибку:
[InvalidArgumentException]
Project directory domains/localhost/ is not empty.
В интернете не хватает нормального гайда по установке yii на опенсервер.
Дело в том, что первую задачу я решил, вот она:
http://ideone.com/mnUebV
На ее основании попытался решить про айпад и ничего пока не вышло, второй день над ней сижу и уже ощущаю себя тупицей.
Она не правильно решена, так что можно сказать, что ты её не решил. Ты выкладывал её в тред? ОП бы тебе сказал, что тут решение не верное. У тебя должно получиться в конце 61 тысяча с чем-то.
а про остаток и платеж: я так понимаю, если цикл придет к значению $totalCredit < $monthPay, то анону нужно будет заплатить меньше 5к, именно поэтому я ввел эту строку. В первой задаче все работало, внимание рассеялось, не могу понять, в чем дело.
Я ща не поленюсь посчитать на бумаге и скажу тебе, правильно ли она решена.
Так код внутри функции в этой задаче ничем и не должен отличаться от кода в предыдущей задаче, можно тупо скопировать его внутрь функции. А у тебя вообще что-то не то, в первой задаче у тебя совсем другое тело в условии, а тут ты просто break написал и думаешь, что каким-то чудесным образом остаток сам себя выплатит.
>>453222
Тут каждую неделю по несколько анонов эту задачу выкладывает и у всех получается 59к, а нужно 61, я уже скоро наизусть выучу. Если ты не веришь мне, дождись ОПа.
1 - 37200
2 - 34316
3 - 31345.48
4 - 28285.8444
5 - 25134.419732
6 - 21888.45232396
7 - 18545.1058936788
8 - 15101.459070489164
9 - 11554.50284260383892
10 - 7901.1379278819540876
11 - 4138.172065718412710228
вот такая хуйня получилась, все действия считал вручную
Я так понял, ты из тех, кто не может дать подсказку и просто пиздит на новеньких. Буду ждать ОПа, от тебя ничего дельного не услышал.
Прости, напиздел на тебя. Воткнул ща в код про айпад код из айфона - все заработало. Понимаю, что он не эффективный. Ща отредактирую, скину сюда.
На последнем месяце 4138 просто добавляется к общей выплате, а должно быть, чтобы начислялся сервис пеймент и процент.
ОП, два дня я мучил себе голову с этой задачей, посмотри на решение. Теперь я не могу понять, почему в ответе появляется писанина "7777" в конце? Укажи на мои ошибки, дай советы по оптимизации кода.
Точно, вот я мудила
>Тут каждую неделю по несколько анонов эту задачу выкладывает и у всех получается 59к, а нужно 61, я уже скоро наизусть выучу. Если ты не веришь мне, дождись ОПа.
А я не выкладывал, но у меня 61 было.
Проверь две эти задачи:
http://ideone.com/mnUebV - айфон
http://ideone.com/VvdK1k - айпад
Где косяки? Кроме писанины предпоследнего месяца в айфонею
Она прибавляется, поэтому у тебя в конце 7777 и пишет. Фишка в том, что сама функция ничего не возвращает и соответственно 777 к нулю прибавляется.
Какой я молодец.
А я бы изначально добавил в функцию $oneTimeTax, В случае если нет первоначального взноса было бы 0.
http://ideone.com/mnUebV
>Анон платит 13-й месяц. Заплатил уже 65000. Остаток задолженности -3729.8132554793.
>Анон платит 14-й месяц. Заплатил уже 61270.186744521. Остаток задолженности 0.
Так быть не должно. Не уходи в минус. Школьник же не переплачивает. Если нужно выплатить меньше 5000, так и плати меньше 5000. Ещё и 14ый месяц вылез откуда-то.
http://ideone.com/VvdK1k
Внизу сообщение об ошибке.
>PHP Notice: Undefined variable: total in /home/aqfQeg/prog.php on line 7.
Исправь её.
http://phpfaq.ru/pdo
Блин, весь день спал, а никто и не чекнул мою задачу за это время, ну посмотрите может быть хотя бы те кто уже решал и сечет в ООП, укажите на пару недочетов?
>>453165
Я тебе советую выводить echo для наглядности на каждой итерации цикла например, и нормально форматировать код, а то я сначала ничего не понял в твоей стене и хотел тебе указать что у тебя month++; дублируется с $month = $month+1; и только потом понял что это костыль внутри условия if() {}
После того как ты все отладишь, то эхо можно будет убрать имхо.
http://ideone.com/5Q303W
Ну и у тебя неопределенная переменная, её нужно завести, перед тем как в неё что-то складывать, но это совсем мелочь.
Да как не уходить в минус? Всегда в минус ухожу, теперь вернулся к задаче с айфоном...
http://ideone.com/6Wmp5F
Пока к такому коду пришел, но не могу допереть, как сделать так, чтобы он мне посчитал еще одну операцию платежа и не ушел в минус.
Проблема в формуле. Её надо переделать. Нельзя не уходить в минус, когда у тебя сначала отнимается ежемесячный платеж, а потом уже идет проверка оставшейся суммы кредита.
http://ideone.com/VvdK1k
>for ($month = 1; $month <= 20; $month++) {
>$creditSum = ($creditSum * $bankPercent) + $tax - $monthPay;
Зачем каждый месяц к кредиту прибавлять первоначальный долг? Он же ПЕРВОНАЧАЛЬНЫЙ.
*долг -> взнос
Тебя тут не хватало. Прочти внимательно условие задачи.
http://ideone.com/ZFZAG8
Посмотри новую версию кода.
Вот так правильно.
Всё верно, я обосрался. Буду внимательнее.
Первоначальный взнос должен прибавляеться к кредиту. Так сказано в задаче.
А в твоём решении его спрашивают после того как кредит погашен. Банк теряет с этого процентики, нехорошо.
И как удаётся школьнику погасить эту сумму на следующий месяц. Причём не зависимо от того как взнос велик, он будет погашен за 1 раз.
Опять же ошибка, что баланс уходит в минус.
Блин мне реально нужна критика перед тем как я кошкомашкам приступлю. Вангую что все подряд public это типа фейл?
http://ideone.com/gesFwJ
ПРодолжаю старую песню пока, мне нужно разобраться для чего нужно ставить паблик, приват и протектед перед этим?
Ну как для чего? Чтобы нельзя было изменить случайно какое-нибудь свойство, чтобы они менялись только методами.
>>453435
Ну как же так, мы же вроде разобрались тогда?
> Почему выдается ошибка о том что я вызываю функцию не к объекту, когда я обращаюсь именно к нему?
Посмотри на свой код:
$newLeader = reset($filteredEmployees);
$newLeader->setLeader(true);
Если 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 и с базой данных.
Так что в общем все верно, но те места где автор предлагает свой код и свою библиотеку, лучше пропустить.
> С тех пор, как тронувшиеся умом разработчики РНР решили запретить невинную библиотеку 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 коде. Очень жаль, что ты не проверил свой код перед тем как мне его отправить, хотя я просил проверить.
Исправь все ошибки, на которые указывает валидатор, или напиши почему ты вынужден был написать код с ошибками. Если тебе непонятен текст какой-то ошибки, я готов помочь. Но пока код не будет проходить валидацию (или не будет объяснения по каждому случаю отступления от стандарта), я его проверять не буду.
CSS валидатор https://jigsaw.w3.org/css-validator/ показывает одну ошибку, в коде от Font Squirrel. Если заключить содержимое url()
src: url(data:application/x-font-woff;
в одиночные кавычки, ошибки не будет.
Там alt для картинок не указан и что-то со шрифтами, которые я вставил, ну альт я могу добавить, а шрифты я вставил с гугл фонтса и другого сайта, который ты мне посоветовал.
Репостну: анон ищет
> анонов для совместной разработки чего-нибудь интересного и нескучного
>>452596
Исправь замечания которые показывает валидатор HTML либо объясни почему необходимо отступить от стандарта:
http://validator.w3.org
Если что-то непонятно, пиши, я поясню.
>>452725
Все решено правильно, упрощать ничего не надо.
>>452739
> Таких как я, наверное, называют говнокодер и пхп макака.
К начинающим претензий никаких быть не должно пока они учатся.
В твоем случае код работает и хорошо. Чуть-чуть упростить можно за счет функции array_rand, подробности в мануале.
Перменные можно было просто назвать $word1, $word2, или что умнее, сложить в массив:
$words[0] = ...
$words[1] = ...
Всегда когда ты видищь переменные с цифрами, задумайся, не лучше ли использовать массив?
Репостну: анон ищет
> анонов для совместной разработки чего-нибудь интересного и нескучного
>>452596
Исправь замечания которые показывает валидатор HTML либо объясни почему необходимо отступить от стандарта:
http://validator.w3.org
Если что-то непонятно, пиши, я поясню.
>>452725
Все решено правильно, упрощать ничего не надо.
>>452739
> Таких как я, наверное, называют говнокодер и пхп макака.
К начинающим претензий никаких быть не должно пока они учатся.
В твоем случае код работает и хорошо. Чуть-чуть упростить можно за счет функции array_rand, подробности в мануале.
Перменные можно было просто назвать $word1, $word2, или что умнее, сложить в массив:
$words[0] = ...
$words[1] = ...
Всегда когда ты видищь переменные с цифрами, задумайся, не лучше ли использовать массив?
Отображение ошибок включено? В этом случае при ошбках php выведет сообщение.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
>>452766
Не знаю даже, огорчишься ты или обрадуешься, но в компьютерной арифметике есть +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, то это не вызвыает проблем. Я ни разу в жизни не видел ни одного бага из-за этого.
https://gist.github.com/MindiMakridi/51ad14e55f261467f918
Тут же только код можно выкладывать, файлами по моему нагляднее.
думаю для такой простой задачи это лишнее.
>>452797
>>453157
Если ты не умеешь работать с циклами и массивам в PHP то тебе надо сначала изучить эти темы. Без этих основ писать скрипты не получится.
Также изучи внимательно документацию по json decode: http://php.net/manual/ru/function.json-decode.php
>>452823
А ты решал более простую задачу про айфон и один банк? Если да то надо просто завернуть код решения в фунцию. Если нет то реши сначала про айфон.
Только давай без ругательств.
>>452883
Тебе надо решить сначала задачу про айфон.
>>452907
Задачу про айфон решал? Не решал ведь. надо просто код от той задачи засунуть в функцию.
В твоем случае у тебя нет проверки чему равен долг. Если долг маленлкьй надо платиь не 5000 а сколько осталось. Если долг дошел до нуля то платить больше не надо.
>>452912
Для начала, возьми эту инструкцию и научись запускать код в консоли: https://gist.github.com/codedokode/7054af4a03865c4cc863 (устанавливать сам php не надо если он у тебя уже есть)
Вот гайд по командной строке: https://gist.github.com/codedokode/10539568
затем тебе надо научиться запускать код через браузер и веб-сервер. Вот сборник ответов на вопросы: https://gist.github.com/codedokode/10774100
Если что-то непонятно, то задавай уточняющие вопросы. В идеале ты должен уметь запускать код и через консоль и через браузер.
Под виндой в консоли не заработают русские буквы в utf-8.
Только давай без ругательств.
>>452883
Тебе надо решить сначала задачу про айфон.
>>452907
Задачу про айфон решал? Не решал ведь. надо просто код от той задачи засунуть в функцию.
В твоем случае у тебя нет проверки чему равен долг. Если долг маленлкьй надо платиь не 5000 а сколько осталось. Если долг дошел до нуля то платить больше не надо.
>>452912
Для начала, возьми эту инструкцию и научись запускать код в консоли: https://gist.github.com/codedokode/7054af4a03865c4cc863 (устанавливать сам php не надо если он у тебя уже есть)
Вот гайд по командной строке: https://gist.github.com/codedokode/10539568
затем тебе надо научиться запускать код через браузер и веб-сервер. Вот сборник ответов на вопросы: https://gist.github.com/codedokode/10774100
Если что-то непонятно, то задавай уточняющие вопросы. В идеале ты должен уметь запускать код и через консоль и через браузер.
Под виндой в консоли не заработают русские буквы в utf-8.
лучше ставить самому. openserver для опытных программистов. denver вообще что-то устаревшее по моему.
>>452914
> поясните, я ошибаюсь PDO на самом деле удобнее и я просто не всё понял?
PDO умеет выбрасывать исключения при ошибке а в mysqli ты должен писать if с проверкой после каждого вызова функции.
> Мне как-то показалось что писать что то такое:
> Будет довольно напряжно
Пиши нормальный запрос вроде
$stmt = $pdo->prepare('INSERT INTO t (a, b, c) VALUES (:a, :b, :c)');
Покажи свой код и что выводит браузер (нажми Ctrl + U в браузере чтобы увидеть исходный код.)
>>452945
Как файл называется? php установлен? Что браузер покажет если нажать Ctrl + U (исходный код страницы)
Вместо <? надо писать <?php
Книга по которой ты учишься очень старая. PHP 4 был 10 лет назад.
Она старая и там довольно плохие примеры кода.
>>453014
> вдумчиво и пережевывая подается док с пхп,нет
Но не быстрее и не проще ли прочитать самому эту документацию? Ну и мое мнение, начинающему равновато браться за сложные вещи вроде двоичной арифметики (& | ^). Эти темы надо изучать отдельно с разброром что такое довичные числа, биты и т.д.
>>452989
> Можно как-нибудь проверять, что приходит в функцию?
> А я как раз делаю конструктор сотрудника и хочу что бы туда сразу передавался его ранг в виде int и то, начальник он нет, в виде bool.
Можно через ифы:
if (!is_numeric($rank) || $rank < 1 || $rank > 3) {
throw new ArgumentException("rank must be a number, '$rank' given");
}
Можно через assert:
assert(is_numeric($rank));
assert($rank >= 1);
assert($rank <= 3);
ассерты хороши тем что как бы документируют код, показывая что автор кода ждет.
> Например у меня будет человек повышаться в ранге. Соответственно нужно делать 2 переменных под зарплату?
Можно хранить только базовую ставку которая никогда не меняется, а зарплату не хранить нигде.
Она старая и там довольно плохие примеры кода.
>>453014
> вдумчиво и пережевывая подается док с пхп,нет
Но не быстрее и не проще ли прочитать самому эту документацию? Ну и мое мнение, начинающему равновато браться за сложные вещи вроде двоичной арифметики (& | ^). Эти темы надо изучать отдельно с разброром что такое довичные числа, биты и т.д.
>>452989
> Можно как-нибудь проверять, что приходит в функцию?
> А я как раз делаю конструктор сотрудника и хочу что бы туда сразу передавался его ранг в виде int и то, начальник он нет, в виде bool.
Можно через ифы:
if (!is_numeric($rank) || $rank < 1 || $rank > 3) {
throw new ArgumentException("rank must be a number, '$rank' given");
}
Можно через assert:
assert(is_numeric($rank));
assert($rank >= 1);
assert($rank <= 3);
ассерты хороши тем что как бы документируют код, показывая что автор кода ждет.
> Например у меня будет человек повышаться в ранге. Соответственно нужно делать 2 переменных под зарплату?
Можно хранить только базовую ставку которая никогда не меняется, а зарплату не хранить нигде.
Еще есть is_numeric которая принимает строки-числа вроде '1'. Хотя не факт что это хорошо конечно.
>>452998
> как я понимаю родитель не знает о данных своих наследников?
Да. Так как ты не знаешь кто и как будет наследоваться от твоего класса. Вдруг кто-то скачает твой код с гитхаба и унаследует один из классов? Ты не можешь заранее этого знать.
> Могу я составить конструктор в родительском классе, и использовать в нем данные наследников?
Ты можешь обращаться только к тем полям и методам которые есть в родительском классе. Но ты можешь объявить поле или метод в родителе и переопределить в наследнике — это допустимо. Опять же вспомни что кто-то может унаследовать твой класс в будущем.
> Если у сотружников в зависимости от ранга или лидерства меняются параметры, то мне в конструкторе это дело по хардкору настраивать лучше?
лучше не хранить такие параметры нигде.
> Или просто потом сделать функции которые будут это дело сразу высчитывать в процессе?
да
>>453003
> $this->salary = $this->defaultSalary $rankBonus $leaderBonus;
Ты не должен обращаться к полям которые появятся только в начледнике. Это неправильно так как если кто-то унаследует твой класс и не объявит там поле то код сломается.
C MVC мы сталкиваемся в дополнительных задачах ссылки на которые стоят в ОП-посте. MVC нет особого смысла изучать само по себе, надо на примере написания кода иначе ничго не запомнишь.
Вот тут есть краткое объяснение https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
> И главное где в итоге отделение штмл я не увидел, так как эти вьюхи по сути классы с методами типа function output() {echo "<div></div>"}
Обычно вьюха это шаблон без классов в нем. Как тут http://www.phpinfo.su/articles/practice/shablony_v_php.html
> Ну или посоветуй норм источник почитать.
не знаю, погугли на хабре например
> тут мозги не парьте, копируйте и все
это плохой учебник если не объясняет
Вообще htaccess это файл задающий настройки веб-сервера. Там обычно используется mod_rewrite - это модуль который позволяет задать какой php файл мы вызываем при обращении по оределенному URL. Ну например при обращении по URL
/news/12
вызывать файл news.php
> разбиваем урл, первый кусок будет классом, второй кусок будет методом, остальные куски будут параметрами
Это не обязательно. делать можно так как удобнее. Например в /news/12 news это название раздела а 12 это id новости.
Я могу ответить на уточняющие вопросы.
C MVC мы сталкиваемся в дополнительных задачах ссылки на которые стоят в ОП-посте. MVC нет особого смысла изучать само по себе, надо на примере написания кода иначе ничго не запомнишь.
Вот тут есть краткое объяснение https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
> И главное где в итоге отделение штмл я не увидел, так как эти вьюхи по сути классы с методами типа function output() {echo "<div></div>"}
Обычно вьюха это шаблон без классов в нем. Как тут http://www.phpinfo.su/articles/practice/shablony_v_php.html
> Ну или посоветуй норм источник почитать.
не знаю, погугли на хабре например
> тут мозги не парьте, копируйте и все
это плохой учебник если не объясняет
Вообще htaccess это файл задающий настройки веб-сервера. Там обычно используется mod_rewrite - это модуль который позволяет задать какой php файл мы вызываем при обращении по оределенному URL. Ну например при обращении по URL
/news/12
вызывать файл news.php
> разбиваем урл, первый кусок будет классом, второй кусок будет методом, остальные куски будут параметрами
Это не обязательно. делать можно так как удобнее. Например в /news/12 news это название раздела а 12 это id новости.
Я могу ответить на уточняющие вопросы.
ЧТо ты умеешь и знаешь, а что нет? PHP знаешь? Писать скрипты выполняющиеся на сервере через браузер умеешь?
>>453469
Точно, шрифты и картинки не скачиваются. ну ладно, давай тогда архивами но осваивай гит побыстрее. Вот тебе книжка в помощь
http://git-scm.com/book/ru/v1
> ну альт я могу добавить,
добавь
> а шрифты я вставил с гугл фонтса и другого сайта,
Там ошибка в том что & это спецсимвол и его надо вписывать как & в тексте и атрибутах. Эти 3 символа
< > &
надо вставлять через HTML мнемоники и верстальщик должен это знать.
> для чего нужно ставить паблик, приват и протектед перед этим?
Ты разрешаешь или запрещаешь другим программистам обращаться к полям и методам. Поля лучше все сделать закрытыми так как в этом случае поменять их значения можешь только ты. Никто другой не может вписать туда неправильные значения (а если он их передает тебе через метод то ты можешь их там проверить). То есть это повышает понятность (я когда хочу понять как использовать класс смотрю только на public методы) и надежность (никто не запишет тебе отрицательную зарплату в поле).
То есть класс получается как закрытая коробка: ты можешь нажимать на оставленные автором кнопки (методы) но не можешь залезть внутрь.
ОП устал, лег спать и проспал часов 14 наверно в сумме. ну и пока прибирался, мылся, завтракал еще несколько часов прошло.
> почему тред затухает так сильно в выходные?
Я бы не сказал что затухает. Просто сейчас мы в бамплимите и меньше людей заходит.
используй excel/openoffice/google drive лучше, ты ж программист! Серьезно, иметь компьютер и считать на бумажке!
>>453219
да, 61270 по моему
>>453225
А надо было в екселе, тогда было бы легко поменять сумму
Также вот тебе еще пара примеров более простых:
берем 1000 отдаем 2030
берем 4000 отдаем 6120
Проверь что твоя программа так и считает.
>>453224
да, у всех получается 59 k потому что они неправильно считают а должно быть 61.
Ура, наконец-то ты дошел и до моей задачи. Это единственное замечание?
>Ты не должен обращаться к полям которые появятся только в начледнике. Это неправильно так как если кто-то унаследует твой класс и не объявит там поле то код сломается.
Я голову ломал как сделать так, что бы 1 раз грамотно сделать эту функцию, и не копипастить её для каждого класса. В таком случае мне нужно просто родителю добавить это поле? Или мне нужно для каждого наследника в таком случае одинаковый метод вводить??
я добавил классу $employee поле \tpublic $defaultSalary;
вроде бы ничего не сломалось, нормальное решение?
Только делать это лучше не руками, а используя микрофреймвокр вроде Slim/Silex или библиотеку-роутер.
>>453087
> я нахожу кучу проектов по доработке сайтов на джумле/вордпрессе (второе преобладает) + написание плагинов для них, и тут я в ступоре.
Это днопроекты в основном. CMS (Джумла и вордпресс) рассчитаны в первую очередь на создание сайтов без программирования, лишь нажимая кнопочки в админке (максимум верстку порезать и добавить). Вордпресс вообще ориентирован на хипстеров который может придти в кофейню с макбуком и не напрягаюсь развернуть блог чтобы постить фотки и длинные глубокомысленные тексты без абзацев. Ну а джумла ориентирована на веб-студии, делающие сайт за 3000 рублей. Имей это в виду.
Собственно, чтобы их осввоить, достаточно прочесть мануалы с оф. сайтов. Пользовательский мануал раскажет как пользоваться админкой, а мануал для разработчиков (designer docs) расскажет как натянуть верстку и может написать плагин. Документация наверно на английском, но у вордпресса что-то есть в русском переводе. Их освоение у тебя максимум неделю займет. Ну и еще надо найти самые популярные плагины к ним и запомнить для чего они нужны.
Если ты хочешь, я могу придумать задание на тот же вордпресс, которое включает в себя и натяжку макета и может быть написание своего плагина. например сделать аналог siliconrus.com или что-то похожее. Но сначала глянь документацию.
> допустим у чувака интернет магазин на какой-то cms-ке, у него там в корзине какие-то поля есть, он просит добавить, например, выбор цвета для товара/добавить новые поля/еще какая-то параша которая, как я понимаю, связана с работой с бд. Но как это сделать?
Первым делом умнее всего глянуть документацию к CMS и погуглить. Может там есть возможность, может нет. Менять код сторонней CMS большая глупость так как ее потом нельзя будет обновлять (но неграмотные разработчики с фриланса часто так делают ради экономии времени). Вообще, меня жутко бесят люди которые что-то правят в сторонних библиотеках. Это рано или поздно принесет проблемы и кому-то придется их исправлять.
> Лезть в скрипт той же корзины, искать где там добавление товара в базу, предварительно добавлять в базу еще одно поле (если чуваку цвет нужен например), и добавлять?
ну может и так, не знаю. Может в CMS есть система событий (хуков) или расширений и ты можешь допустим добавить чтобы перед вставкой вызывалась твоя функция и она там добавляла поля (в Друпале обычно так делают). Ну то есть если ты сделал свое расширение, ты можешь в нем сделать функции с определенными именами и они будут вызываться при тех или иных событиях.
> В целом вообще не понимаю, как работать с БД и вносить поправки в скрипты в этих ебаных CMS.
Работать с Бд через функции API. Вот например в вордпрессе есть $wpdb:
https://codex.wordpress.org/Class_Reference/ru:wpdb_Class
Вносить попроавки в скрипты лучше не стоит. Лучше подписаться на событие через создание функции-хука (или другим способом). Вот хуки в вордпрессе:
http://codex.wordpress.org/Plugin_API/Hooks
http://habrahabr.ru/post/67680/
Я бы тебе конечно советовал осваивать нормальные фреймворки вроде Symfony 2 или Yii2. на них правда заказов меньше но там ты будешь более менее с адекватным кодом работать.
Только делать это лучше не руками, а используя микрофреймвокр вроде Slim/Silex или библиотеку-роутер.
>>453087
> я нахожу кучу проектов по доработке сайтов на джумле/вордпрессе (второе преобладает) + написание плагинов для них, и тут я в ступоре.
Это днопроекты в основном. CMS (Джумла и вордпресс) рассчитаны в первую очередь на создание сайтов без программирования, лишь нажимая кнопочки в админке (максимум верстку порезать и добавить). Вордпресс вообще ориентирован на хипстеров который может придти в кофейню с макбуком и не напрягаюсь развернуть блог чтобы постить фотки и длинные глубокомысленные тексты без абзацев. Ну а джумла ориентирована на веб-студии, делающие сайт за 3000 рублей. Имей это в виду.
Собственно, чтобы их осввоить, достаточно прочесть мануалы с оф. сайтов. Пользовательский мануал раскажет как пользоваться админкой, а мануал для разработчиков (designer docs) расскажет как натянуть верстку и может написать плагин. Документация наверно на английском, но у вордпресса что-то есть в русском переводе. Их освоение у тебя максимум неделю займет. Ну и еще надо найти самые популярные плагины к ним и запомнить для чего они нужны.
Если ты хочешь, я могу придумать задание на тот же вордпресс, которое включает в себя и натяжку макета и может быть написание своего плагина. например сделать аналог siliconrus.com или что-то похожее. Но сначала глянь документацию.
> допустим у чувака интернет магазин на какой-то cms-ке, у него там в корзине какие-то поля есть, он просит добавить, например, выбор цвета для товара/добавить новые поля/еще какая-то параша которая, как я понимаю, связана с работой с бд. Но как это сделать?
Первым делом умнее всего глянуть документацию к CMS и погуглить. Может там есть возможность, может нет. Менять код сторонней CMS большая глупость так как ее потом нельзя будет обновлять (но неграмотные разработчики с фриланса часто так делают ради экономии времени). Вообще, меня жутко бесят люди которые что-то правят в сторонних библиотеках. Это рано или поздно принесет проблемы и кому-то придется их исправлять.
> Лезть в скрипт той же корзины, искать где там добавление товара в базу, предварительно добавлять в базу еще одно поле (если чуваку цвет нужен например), и добавлять?
ну может и так, не знаю. Может в CMS есть система событий (хуков) или расширений и ты можешь допустим добавить чтобы перед вставкой вызывалась твоя функция и она там добавляла поля (в Друпале обычно так делают). Ну то есть если ты сделал свое расширение, ты можешь в нем сделать функции с определенными именами и они будут вызываться при тех или иных событиях.
> В целом вообще не понимаю, как работать с БД и вносить поправки в скрипты в этих ебаных CMS.
Работать с Бд через функции API. Вот например в вордпрессе есть $wpdb:
https://codex.wordpress.org/Class_Reference/ru:wpdb_Class
Вносить попроавки в скрипты лучше не стоит. Лучше подписаться на событие через создание функции-хука (или другим способом). Вот хуки в вордпрессе:
http://codex.wordpress.org/Plugin_API/Hooks
http://habrahabr.ru/post/67680/
Я бы тебе конечно советовал осваивать нормальные фреймворки вроде Symfony 2 или Yii2. на них правда заказов меньше но там ты будешь более менее с адекватным кодом работать.
И имей в виду, кроме фриланса есть еще просто удаленная работа, выгода в том что не надо тратить время на поиск и переговоры с заказчиками.
>>453143
> public function addWorkers($amount, $class, $rank, $leader) {
>\t\tfor($i=1; $i<=$amount; $i++ ) {
>\t\t\t$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), было бы неплохо. Но это не обязательно.
И имей в виду, кроме фриланса есть еще просто удаленная работа, выгода в том что не надо тратить время на поиск и переговоры с заказчиками.
>>453143
> public function addWorkers($amount, $class, $rank, $leader) {
>\t\tfor($i=1; $i<=$amount; $i++ ) {
>\t\t\t$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), было бы неплохо. Но это не обязательно.
Посмотри там внизу ошибка, ты обращаешься к несуществующей еще переменной:
> PHP Notice: Undefined variable: total in /home/aqfQeg/prog.php on line 7
Это надо исправить.
> if ($creditSum < 0) {
Лучше бы сделать без ухода в минус.
Если подставить сумму 999 то считает неправильно: http://ideone.com/omeFCw
> Анон платит 2 месяцев. Заплатит 2028.97 банку SOFTBANK.
Не 2 месяца, а 1.
> $homoCredit = totalPay(...)
какой смысл это писать если у тебя в функци нет return и она всегда возвращает null?
Ну и код будет лучше если функция не будет ничего выводить, а только возвращать цифры через return. А тот, кто ее вызывал, уже сам выведет результат как ему нравится.
В заголовке окошка? да, слишком резкий какой-то и текст плохо читается.
>>453170
> brea
Не дописал
>>453177
> Прикинул стек, который мне для этого нужен:
Я бы прежде чем писать велосипед с нуля, спросил себя: нельзя ли использовать CMS или фреймворк? Например если сайт в основном информационный и содержит статьи то можно использовать вордпресс, если это магазин то магазинную CMS. С другой стороны фреймворк позволяет тебе написать что угодно, не ограничивая рамками. тут вполне подошел бы Yii2.
> могу ли я расчитывать на получение работы джуном в ДС2 например?
Все зависит от компании. Скорее да, чем нет. С другой стороны, говорят сейчас кризис и нанимают меньше людей и требования выше.
>>453209
> но, у меня папка basic не в domains/localhost, а в корне open servera,
зря
> Не вручную же переносить в localhost?
Можно удалить все и установить заново в правильную папку.
>>453211
Я советую поставить var_dump или echo, чтобы вывести значения переменных в цикле и увидеть чему они равны и что там не так.
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
>>453216
> Project directory domains/localhost/ is not empty.
папка должна быть пустой
> не хватает нормального гайда по установке yii на опенсервер.
А опенсервер чем-то отличается от Апача + php что ему нужен особый гайд?
Задавай мне вопросы, я постараюсь ответить. ТОлько не забывай писать что ты сделал и что вывелось.
В заголовке окошка? да, слишком резкий какой-то и текст плохо читается.
>>453170
> brea
Не дописал
>>453177
> Прикинул стек, который мне для этого нужен:
Я бы прежде чем писать велосипед с нуля, спросил себя: нельзя ли использовать CMS или фреймворк? Например если сайт в основном информационный и содержит статьи то можно использовать вордпресс, если это магазин то магазинную CMS. С другой стороны фреймворк позволяет тебе написать что угодно, не ограничивая рамками. тут вполне подошел бы Yii2.
> могу ли я расчитывать на получение работы джуном в ДС2 например?
Все зависит от компании. Скорее да, чем нет. С другой стороны, говорят сейчас кризис и нанимают меньше людей и требования выше.
>>453209
> но, у меня папка basic не в domains/localhost, а в корне open servera,
зря
> Не вручную же переносить в localhost?
Можно удалить все и установить заново в правильную папку.
>>453211
Я советую поставить var_dump или echo, чтобы вывести значения переменных в цикле и увидеть чему они равны и что там не так.
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
>>453216
> Project directory domains/localhost/ is not empty.
папка должна быть пустой
> не хватает нормального гайда по установке yii на опенсервер.
А опенсервер чем-то отличается от Апача + php что ему нужен особый гайд?
Задавай мне вопросы, я постараюсь ответить. ТОлько не забывай писать что ты сделал и что вывелось.
> Анон платит 13-й месяц. Заплатил уже 65000. Остаток задолженности -3729.8132554793.
Лучше в минус не уходить, а то странно смотрится.
>>453220
> , если цикл придет к значению $totalCredit < $monthPay, то анону нужно будет заплатить меньше 5к, именно поэтому я ввел эту строку.
Да но проверять это надо после добавления процентов и комиссии, а не до.
>>453227
Насчет 61к он прав.
>>453233
> $strawberryBank = totalPay(5000, 0, 39999, 1.02, 'STRAWBERRYBANK') + $oneTimeTax;
Функция возвращает null и получается
$stb = null + 7777; // = 7777
Ниже это выводится через echo.
>>453238
> Анон платит 13-й месяц. Заплатил уже 65000. Остаток задолженности -3729.8132554793.
Как может быть отрицательный долг? Школьник что ли переплатил и теперь банк ему должен? Так не должно быть.
Если подставить кредит = 1000 то пишет что отдавать его 2 месяца, а это неверно: http://ideone.com/yC5lX8
Должно быть 1 месяц.
>>453239
7777 надо прибавлять до начала расчета, а не после. а то на них проценты не начисляются.
>>453291
> а никто и не чекнул мою задачу за это время,
Оп тоже полдня проспал, что поделать. Не скучай. решай пока другие задачи, рано или поздно и до тебя очередь дойдет.
>>453317
> PHP Notice: Undefined variable: total in /home/nz8lPL/prog.php on line 10
Эту ошибку надо исправить. ну и в минус лучше не уходить. лучше не платить всегда ровно 5000 а смотреть сначала чему равен долг.
>>453411
Лучше тут все поля сделать закрытыми, это делает код более надежным.
>>453435
> Я в каждой конкретной специальности прописал в параметрах необходимые значения зарплаты, кофе и документов. И в файле создания департаментов (department.php) изменил добавления сотрудников. А при выводе почему-то все эти значения остаются пустыми.
Я же написал тут >>452196 — это из-за private
> Анон платит 13-й месяц. Заплатил уже 65000. Остаток задолженности -3729.8132554793.
Лучше в минус не уходить, а то странно смотрится.
>>453220
> , если цикл придет к значению $totalCredit < $monthPay, то анону нужно будет заплатить меньше 5к, именно поэтому я ввел эту строку.
Да но проверять это надо после добавления процентов и комиссии, а не до.
>>453227
Насчет 61к он прав.
>>453233
> $strawberryBank = totalPay(5000, 0, 39999, 1.02, 'STRAWBERRYBANK') + $oneTimeTax;
Функция возвращает null и получается
$stb = null + 7777; // = 7777
Ниже это выводится через echo.
>>453238
> Анон платит 13-й месяц. Заплатил уже 65000. Остаток задолженности -3729.8132554793.
Как может быть отрицательный долг? Школьник что ли переплатил и теперь банк ему должен? Так не должно быть.
Если подставить кредит = 1000 то пишет что отдавать его 2 месяца, а это неверно: http://ideone.com/yC5lX8
Должно быть 1 месяц.
>>453239
7777 надо прибавлять до начала расчета, а не после. а то на них проценты не начисляются.
>>453291
> а никто и не чекнул мою задачу за это время,
Оп тоже полдня проспал, что поделать. Не скучай. решай пока другие задачи, рано или поздно и до тебя очередь дойдет.
>>453317
> PHP Notice: Undefined variable: total in /home/nz8lPL/prog.php on line 10
Эту ошибку надо исправить. ну и в минус лучше не уходить. лучше не платить всегда ровно 5000 а смотреть сначала чему равен долг.
>>453411
Лучше тут все поля сделать закрытыми, это делает код более надежным.
>>453435
> Я в каждой конкретной специальности прописал в параметрах необходимые значения зарплаты, кофе и документов. И в файле создания департаментов (department.php) изменил добавления сотрудников. А при выводе почему-то все эти значения остаются пустыми.
Я же написал тут >>452196 — это из-за private
callback функция (функция обратного вызова) это когда ты передаешь в функцию другую функцию, и та ее вызывает. Они используются например в таких функциях как:
usort: http://php.net/manual/ru/function.usort.php
preg_replace_callback: http://php.net/manual/ru/function.preg-replace-callback.php
array_filter: http://php.net/manual/en/function.array-filter.php
array_map: http://php.net/manual/en/function.array-map.php
Пока довольно слабо сделано и много чего надо исправить.
> <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 дюйма, но я ни разу такого не видел на практике. Может быть при печати это так, не знаю.
Почитай:
http://www.w3.org/Style/Examples/007/units.ru.html (тут перевод странный)
http://css-live.ru/articles/novye-i-starye-edinicy-izmereniya-kratkij-obzor.html
Заметь что там довольно сложное определение пикселя. Это связано с появлением ретина-экранов. Раньше 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 или не использовать вовсе.
> font-family: "Lato";
Не збывай в конце списка добавлять fallback шрифт: http://htmlbook.ru/css/font-family (по моему я об этом писал)
CSS весь как-то раскособочился, нагугли сервис форматирования cSS и отформатируй.
> font-size: 18pt;
Всегда когда задаешь font-size задавай line-heitgh.
> .button+span{
Что за странный стиль если прочитать: любой спан, идущий после кнопки с классом button?
Причем далее идет еще более страный стиль:
> input:checked+span{
Любой спан идущий после любой нажатой кнопки?
Не пиши такие противоречивые стили. используй классы например
.portfolio-selector .button
.portfolio-selector .radio:checked + .button
Смотри, насколько это понятнее: даже не видя html понятно что это за элементы.
> <div class="socialnetworks" id="yellowthing"><a href="https://gist.github.com/codedokode/58ebc90bd006baf4b35c"></a></div>
Я думаю div тут лишний.
Сделай чтобы социальные кнопки реагировали на наведение. Темнели или светлели например или еще как-то.
Пока довольно слабо сделано и много чего надо исправить.
> <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 дюйма, но я ни разу такого не видел на практике. Может быть при печати это так, не знаю.
Почитай:
http://www.w3.org/Style/Examples/007/units.ru.html (тут перевод странный)
http://css-live.ru/articles/novye-i-starye-edinicy-izmereniya-kratkij-obzor.html
Заметь что там довольно сложное определение пикселя. Это связано с появлением ретина-экранов. Раньше 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 или не использовать вовсе.
> font-family: "Lato";
Не збывай в конце списка добавлять fallback шрифт: http://htmlbook.ru/css/font-family (по моему я об этом писал)
CSS весь как-то раскособочился, нагугли сервис форматирования cSS и отформатируй.
> font-size: 18pt;
Всегда когда задаешь font-size задавай line-heitgh.
> .button+span{
Что за странный стиль если прочитать: любой спан, идущий после кнопки с классом button?
Причем далее идет еще более страный стиль:
> input:checked+span{
Любой спан идущий после любой нажатой кнопки?
Не пиши такие противоречивые стили. используй классы например
.portfolio-selector .button
.portfolio-selector .radio:checked + .button
Смотри, насколько это понятнее: даже не видя html понятно что это за элементы.
> <div class="socialnetworks" id="yellowthing"><a href="https://gist.github.com/codedokode/58ebc90bd006baf4b35c"></a></div>
Я думаю div тут лишний.
Сделай чтобы социальные кнопки реагировали на наведение. Темнели или светлели например или еще как-то.
Пробежался по задачкам -- все что в туторах могу решить, сложности возникают пожалуй лишь с задачами среднего уровня (до пхп писал на c# и с++)
Так вот, после строгих шарпа и си++ (особенно последнего) я никак не в могу в нормальный код на пхп.
Как пример: http://ideone.com/oXXHdo
Я не понимаю, как правильно разделять, что называется логику и представление в пхп, если я не хочу ставить себе фреймворк (там модель построения вынуждает это делать я так понимаю) ?
В примере понятно что ajax бесполезен, но я именно для примера привел: есть вот js/ajax код какой-то, есть хтмл в который надо внедрить пхп, есть сам пхп код. Как правильно разделить? Если с js можно в отдельный файл его пихнуть и подключить, то как быть, когда мне нужно в хтмл внедрить пхп? Смотрю на эти echo в которых печатаются хтмл-теги и интуитивно понимаю, что это говно.
Подскажи, пожалуйста.
Я так понял то, что ты хочешь, называется шаблонизацией. Смотри задачу на сайт для студентов у ОПа.
хм, упустил из виду видимо. спасибо, гляну.
Проверьте решение задачки с банкоматом.
<?php
error_reporting(-1);
$anonDice1 = mt_rand(1,6);
$anonDice2 = mt_rand(1,6);
$anonSum = ($anonDice1+$anonDice2);
$botDice1 = mt_rand(1,6);
$botDice2 = mt_rand(1,6);
$botSun - ($botDice1+$botDice2);
echo "у анона выпало $anonDice1 и $anonDice2\n";
echo "у бота выпало $botDice1 и $botDice2\n";
if(($anonDice1==$anonDice2)&&($botDice1==$botDice2)){
\techo"2 дабла просто заебись, игру надо прекращать \n";
\texit();
\t
}
if($anonSum==$botSum){
\techo"победила дружба\n";
}
if($anonSum > $botSum){
echo"победил anon\n"; \t
}
if($anonSum < $botSum){
\techo"победил бот епта\n";
}
Почему у меня всегда пишется, победил анон, что бы не выпало у бота?
<?php
error_reporting(-1);
$anonDice1 = mt_rand(1,6);
$anonDice2 = mt_rand(1,6);
$anonSum = ($anonDice1+$anonDice2);
$botDice1 = mt_rand(1,6);
$botDice2 = mt_rand(1,6);
$botSun - ($botDice1+$botDice2);
echo "у анона выпало $anonDice1 и $anonDice2\n";
echo "у бота выпало $botDice1 и $botDice2\n";
if(($anonDice1==$anonDice2)&&($botDice1==$botDice2)){
\techo"2 дабла просто заебись, игру надо прекращать \n";
\texit();
\t
}
if($anonSum==$botSum){
\techo"победила дружба\n";
}
if($anonSum > $botSum){
echo"победил anon\n"; \t
}
if($anonSum < $botSum){
\techo"победил бот епта\n";
}
Почему у меня всегда пишется, победил анон, что бы не выпало у бота?
Для начала неплохо бы выкладывать ссылку на айдеон, вместо кода.
Потому что, в твоём коде $botSum будет всегда равен нулю.
в хтмл у текстареи указываешь атрибут name, например name='info', а у формы его содержащей action и method. в пхп его содержимое ловится как $_POST['info'] или $_GET['info'] в зависимости от метода и дальше уже делай с ним что хочешь. дочитай до форм, постов и гетов и все поймешь.
сыч без социалок
Спасибо.
Вообщем, пока я не докатился до переменных $fuck и $ass мне срочно нужен разбор полётов от вас, великих мудрецов и мыслителей.
Задача про школьника, айфон, кредит. Задача от гения педагогики-Опа - исправить в коде то, что позволяет школьнику переплатить и оставить банк в должниках.
Идея была такая - через переменную break определять состояние долга до последней платы. Т.е. минус один месяц. Потом через if проверяю, меньше ли долг чем 5000 и к break добавляю сколько там долга.
Не знаю как это называется, костыль или мозгоёбство, но это то до чего я дошёл своим куцым умишком. Прошу снизойти и показать как нужно/показать где я не прав в своём решении.
Сука, сонный блядь
http://ideone.com/wm6tW8
Что делать?
Спасибо
В httpd.conf проверь пути, например:
PHPIniDir "C:/php"
LoadFile "C:/php/php5ts.dll"
LoadModule php5_module "C:/php/php5apache2.dll"
AddType application/x-httpd-php .php
Реклама. Чем больше сердечек, тем с большим уважением хомяки отнесутся к ресурсу.
Суть такова: надо вывести связанные таблицы (книги и жанры, многие ко многим), желательно через виджет 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.
Выражение 'condition' => 'genre.genre_id=:genre_id' должно быть в массиве 'with' после 'alias'.
В массиве 'genres', если быть точным.
Еще ты можешь оставить как есть, но при этом свойство together (http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail) для 'genres' должно быть true. Постарайся сам понять почему и как это работает.
Бампаю свой реквест мудрых подзатыльников.
Для начала
>if ($creditBalance < 5000); {
Тут вот убери точку с запятой
Потом остаток кредита проверяй перед тем как платить.
if (первое условие) {
действие необходимое для получения данных для второго условия;
if (второе условие) {
} else {
действие 1;
}
} else {
действие 1;
}
как видно тут повторение "else { действие 1; }" что не есть красиво, какие у вас есть варианты?
(можно с goto, но оно же зло)
Я тебя понял на столько насколько тебя понял.
if (первое условие) {
\tдействие необходимое для получения данных для второго условия;
\tif (второе условие) {
\t\tдействие 1;
\t} else {
\tдействие 2;
\t}
}
<?php
include "inc/bd.php";
include "inc/student.class.php";
include "inc/form.class.php";
$allStudent = Student::outAllStudent($pdo);
?>
тут идёт ХТМЛ шапка таблицы а дальше вновь начинается ПХП код+хтмл
<?
foreach($allStudent as $student) {
?>
<tr>
<td><?= $student["name"];?></td>
<td><?= $student["lastname"];?></a></td>
<td><?= $student["groupNumber"];?></td>
<td><?= $student["email"];?></td>
<td><?= $student["point"];?></td>
<td><?= $student["yearBorn"];?></a></td>
<td><?= $student["site"];?></td>
<td><?= $student["pol"];?></td>
</tr>
<?
}
?>
</table>
Поясните можно ли всё что идёт после этого блока который в самом вверху:
<?php
include "inc/bd.php";
include "inc/student.class.php";
include "inc/form.class.php";
$allStudent = Student::outAllStudent($pdo);
?>
Забросить в шаблон? Не будет ли это нарушением логики приложения, ведь основное что на этой страницы есть получение массива студентов из базы данных, можно ли закидывать foratch в шаблон или это нарушение?
<?php
include "inc/bd.php";
include "inc/student.class.php";
include "inc/form.class.php";
$allStudent = Student::outAllStudent($pdo);
?>
тут идёт ХТМЛ шапка таблицы а дальше вновь начинается ПХП код+хтмл
<?
foreach($allStudent as $student) {
?>
<tr>
<td><?= $student["name"];?></td>
<td><?= $student["lastname"];?></a></td>
<td><?= $student["groupNumber"];?></td>
<td><?= $student["email"];?></td>
<td><?= $student["point"];?></td>
<td><?= $student["yearBorn"];?></a></td>
<td><?= $student["site"];?></td>
<td><?= $student["pol"];?></td>
</tr>
<?
}
?>
</table>
Поясните можно ли всё что идёт после этого блока который в самом вверху:
<?php
include "inc/bd.php";
include "inc/student.class.php";
include "inc/form.class.php";
$allStudent = Student::outAllStudent($pdo);
?>
Забросить в шаблон? Не будет ли это нарушением логики приложения, ведь основное что на этой страницы есть получение массива студентов из базы данных, можно ли закидывать foratch в шаблон или это нарушение?
поправился, вот так вот:
https://ideone.com/AmXonp
как видишь повторение "else { действие 1; }"
Если можно действие необходимое для получения данных для второго условия совершить заранее. Можно сделать так
https://ideone.com/10z49o
Если их можно совершить только после первого условия. То тут уж не знаю.
Что за задача кстати?
>>453973
Спасибо, мессир.
Я исправил, но получилась снова хуйня - код не хочет платить последнюю хапку так, чтобы получилось 61 тысяча, а я слышал, что мудрецы здесь отвечали кому то, что должна быть 61 тысяча.
Ожидаю прихода Всесветлейшего.
http://ideone.com/gJGpym
Потом остаток кредита проверяй перед тем как платить, говорю я.
Сначала банк начислил все проценты. И потом, перед самой выплатой начинаешь проверять, сколько собственно Анон должен банку. Больше 5000, то выплачиваешь 5000, если меньше, то выплачиваешь ровно столько сколько осталось.
А так в верном направлении пока движешься.
я не конкретную задачу, просто не первый раз встречаю такую конструкцию, хотелось бы красивое решение.
нет заранее не подходит вдруг там запрос к базе - лишняя нагрузка
Лишняя нагрузка и запросы к базе решаются помещением результата в переменную:
$userExists = $userMapper->doesUserExist($name);
if ($userExists) ....
Такой код удобно писать внутри функции и вываливаться через return:
if (!$id) {
return null;
}
$model = load($id);
if (!$model) {
return null;
}
doSomething($model);
return $something;
заметь насколько проще все читается без сложных ифов. Хотя в принципе 2 вложенных ифа это не страшно, страшно когда их 4-5 и больше.
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
php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp
но файлы у меня закачиваются без расширений. Нужен ли такой вариант?
Пытался сделать древовидные коментарии, но там с формой для отправки сообщений возникли проблемы. Её ведь аяксом подгружать надо.
Тогда буду доделывать их позже, когда аякс изучу.
И касательно метаданных, в какую сторону копать что б их првильно извлекать.
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
php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp
но файлы у меня закачиваются без расширений. Нужен ли такой вариант?
Пытался сделать древовидные коментарии, но там с формой для отправки сообщений возникли проблемы. Её ведь аяксом подгружать надо.
Тогда буду доделывать их позже, когда аякс изучу.
И касательно метаданных, в какую сторону копать что б их првильно извлекать.
Смотри, ОП, я уменьшил поля для маленького разрешения, а элементы все равно переносятся.
> А в сам файл меняет имя с "picture.jpg" на "GhKEGFeeqJ"
Я не советую делать такие имена. Представь у тебя какие-то пробелым с сайтом, ты лезешь в папку и там 1000 таких файлов. Имена надо стараться делать читаемыми, а для уникальности можно например использовать id (если он известен в этот момент). Чтобы если что, можно было разобраться.
> мм... Именно эта опция отвечала за переименование файла.
Альтернатив несколько. Во-первых, там есть какой-то новый стандарт по которому можно добавлять кодировку в поле filename. Но лучше использовать древний проверенный способ. когда имя для скачивания указывается в конце URL
/download/123.txt(реальное имя на диске)/document.doc
Чтобы это реализовать ты можешь использовать 2 подхода:
- переписывание URL через modrewrite в htaccess
- X_SendFIle когда сначала вызывается твой скрипт. а потом он дает команду Апачу отдавать конкретный файл.
Запилим. А пока ты можешь просто не закрывать тред или нажать звездочку в адресной строке.
>>454049
очевидно надо ширину колонок сделать зависимой от ширины страницы
>>454045
Скачать заново. И лучше не руками а через композер, в этом случае будет быстрее.
>>454033
> Или сделать велосипедную свистопляску - перед скачиванием загружать под исходным именем этот файл в какую-то папку.
нет, это неэффективно. У нас на файлообменнике большинство нагрузки это просмотр файла и скачивание, и наша цель как можно проще это реализовать. Вариант с mod rewrite который переписывает URL
/download/123.txt/documents.doc
на
/files/123.txt
Самый эффективный. Вариант с X-SendFile помедленнее, но он хорош тем что там вызывается
PHP и он может проверить что имя в конце (document.doc) не подменено, так же он может вводить ограничения на число скачиваний и т.д.
Ты в любом случае должен иметь представление какие варианты реализации есть, какие у них преимущества и выбрать тот, который лучше в данной ситуации.
Ссылки
http://www.jasny.net/articles/how-i-php-x-sendfile/ (нужно ставить в Апач модуль для этого)
http://serverfault.com/questions/650633/rename-file-in-apache (mod rewrite)
Неэффективные варианты типа исплоьзования readfile мы не будем рассматривать так как они держат скрипт в памяти на все время отдачи файла.
Запилим. А пока ты можешь просто не закрывать тред или нажать звездочку в адресной строке.
>>454049
очевидно надо ширину колонок сделать зависимой от ширины страницы
>>454045
Скачать заново. И лучше не руками а через композер, в этом случае будет быстрее.
>>454033
> Или сделать велосипедную свистопляску - перед скачиванием загружать под исходным именем этот файл в какую-то папку.
нет, это неэффективно. У нас на файлообменнике большинство нагрузки это просмотр файла и скачивание, и наша цель как можно проще это реализовать. Вариант с mod rewrite который переписывает URL
/download/123.txt/documents.doc
на
/files/123.txt
Самый эффективный. Вариант с X-SendFile помедленнее, но он хорош тем что там вызывается
PHP и он может проверить что имя в конце (document.doc) не подменено, так же он может вводить ограничения на число скачиваний и т.д.
Ты в любом случае должен иметь представление какие варианты реализации есть, какие у них преимущества и выбрать тот, который лучше в данной ситуации.
Ссылки
http://www.jasny.net/articles/how-i-php-x-sendfile/ (нужно ставить в Апач модуль для этого)
http://serverfault.com/questions/650633/rename-file-in-apache (mod rewrite)
Неэффективные варианты типа исплоьзования readfile мы не будем рассматривать так как они держат скрипт в памяти на все время отдачи файла.
> Это нужно, для того, что б из такого формата "2011-06-10 15:18:00" переделывать в такой “4 июня 2011, 14:57″ ?
Нет, «PHP формат» это либо число unix timestamp котрое возвращает time() либо объект DateTime. С помощью стандартных функций ты можешь с такой датой работать. В в твоем варианте не можешь, надо сначала распарсить строку.
Вот мой старый урок по датам: https://gist.github.com/codedokode/10539805
Мне кажется, что хранить дату в стандартном виде внутри объекта было бы удобнее.
> но файлы у меня закачиваются без расширений. Нужен ли такой вариант?
Пусть будет как доплониетльная защита.
> Пытался сделать древовидные коментарии, но там с формой для отправки сообщений возникли проблемы. Её ведь аяксом подгружать надо.
Тогда буду доделывать их позже, когда аякс изучу.
Ты можешь пока сделать радиокнопки перед комментариями для выбора на какой отвечать. А в CSS3 браузерах еще и например подсвечивать выбранный комментарий. А потом переделаешь на яваскрипт.
Аякс тут не обязателен. Тебе незачем слать запрос на сервер чтобы передвинуть форму. Но аякс хорошо бы использовать при отправке комментария.
> И касательно метаданных, в какую сторону копать что б их првильно извлекать.
Библиотека https://github.com/JamesHeinrich/getID3/
Она доступна в packagist если ты используешь композер.
>>454033
А, ты уже сам нашел getId3. Молодец.
> 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? Может можно сделать класс более удобным в исплоьзовании?
>>454033
А, ты уже сам нашел getId3. Молодец.
> 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? Может можно сделать класс более удобным в исплоьзовании?
Не совсем то, что надо.
Ошибка не вылезает, но теперь выводит все записи, без учета условия.
>>453931
Вот это помогло, спасибо.
>Постарайся сам понять почему и как это работает.
Да уж постараюсь теперь. Уже неделю сижу над такими мелочами.
Придется забросить проект (хотя я надеялся сделать его за пару дней, там элементарщина казалось бы, только как ее реализовать средствами фреймворка) и сесть за суровые мануалы.
Я понимаю к чему ты, типа не используй копипаст, не будь быдло-кодером.
Но многим людям для мотивации обучения нужно видеть результаты. Поэтому хватаются за проекты, вместо того чтобы позадротить теорию.
У меня дико горит от колоссальной затраты времени, которая не приносит пока видимых результатов.
Я тут мимопроходил, но я посмотрел на твой исходный вопрос и текст запроса:
> Column not found: 1054 Unknown column 'genre.genre_id'
> Насколько я понял, то ли он это условие WHERE подставляет до того, как сделает JOIN таблиц, то ли сует его в запрос пагинатора, который должен возвращать кол-во записей.
Причина ошибки очевидна любому кто знает SQL: ты обращаешься к не использованной в запросе таблице или синониму, скорее всего забыл добавить JOIN. Так как ты используешь Query Builder от Юи то скорее всего забыл добавить вызов какого-то метода или неправильно его вызвал.
Что я хочу сказать: тебе надо сначала изчить язык SQL и потом изучить сам фрейморк (у Yii неплохая документация). Если ты не хочешь это изучать, то ты всегда будешь напарываться на такие грабли. ты можешь подумать что вместо изучения теории можно нагуглить овтет, но это помогает только в очень простых ситуациях. А как только у тебя будет ситуация посложнее, ты так же окажешься в тупике.
> Поэтому хватаются за проекты, вместо того чтобы позадротить теорию.
Тебе надо хвататься за изучение SQL сначала.
> У меня дико горит от колоссальной затраты времени, которая не приносит пока видимых результатов.
Потому что надо идти от простхы вещей к сложным (SQL -> Active Record в Yii), а не браться сразу за написание кода. Если ты не можешь руками такой запрос написать и прочитать, то браться за Юи рановато.
Ну и у нас есть урок по SQL с простыми туториалами и задачками если интересно: https://gist.github.com/codedokode/10539213
Хотя with ты вроде добавил, странно, тогда видимо ошибка в другом. Тут
http://www.yiiframework.com/doc/guide/1.1/ru/database.arr#sec-5
написано что with делает жадную загрузку связанных записей но не написано что он делает JOIn. А без джойна ты не можешь использовать алиас genre.
Все так, тут http://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail об этом как раз написано.
>Ну как же так, мы же вроде разобрались тогда?
Ну я просто до сих пор не понял почему так случается - почему он становиться пустым?
>это не очень правильно так как одна константа принимает разные значения в разных классах
Разве нельзя одну константу использовать в разных классах? А как тогда быть?
Еще вопрос, как мне правильно унаследовать метод обращения к константе? Если писать в родительском классе self::CONSTANT - выдается ошибка что неизвестная константа.
> $data[$key] = trim(strip_tags($value));
Непонятно зачем strip_tags. С XSS лучше бороться при выводе данных
> if (count($error) > 0) {
> return $error;
> }
А что функция вернет если ошибок нет? Почему такой странный подход? Лучше когда функция возвращает значения одного типа, если массив то всегда массив.
> if (strlen($value) > 5
Надо исплоьзовать mb_strlen: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> foreach ((array) $this->form as $key => $value) {
зачем (array)?
> function clear($data)
Непонятно назначение этой функции. Ведь функция validate проверяет то, что хранится в $this->form
Для методов надо расставить public/protected/private. Поля лучше сделать закрытыми.
> if (is_int($value)) {
Если ты берешь данные из POST/GET ты никогда не получишь int, там либо строки либо массивы.
> abs((int) $value);
Непонятно какой смысл делать abs и какой смысл преобразовывать int в int.
> (int) $value;
эта команда ничего не делает так как ты не сохраняешь результат.
Класс назван неудачно. Можно подумать он работает с любыми формами, но на самом деле только с одной. Значит надо назвать его например StudentForm.
Ну и если ты делаешь задачу про студентов то наверно удобнее заполнять данные в объект-студента и проверять его. А не гонять туда-сюда массивы.
> $data[$key] = trim(strip_tags($value));
Непонятно зачем strip_tags. С XSS лучше бороться при выводе данных
> if (count($error) > 0) {
> return $error;
> }
А что функция вернет если ошибок нет? Почему такой странный подход? Лучше когда функция возвращает значения одного типа, если массив то всегда массив.
> if (strlen($value) > 5
Надо исплоьзовать mb_strlen: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> foreach ((array) $this->form as $key => $value) {
зачем (array)?
> function clear($data)
Непонятно назначение этой функции. Ведь функция validate проверяет то, что хранится в $this->form
Для методов надо расставить public/protected/private. Поля лучше сделать закрытыми.
> if (is_int($value)) {
Если ты берешь данные из POST/GET ты никогда не получишь int, там либо строки либо массивы.
> abs((int) $value);
Непонятно какой смысл делать abs и какой смысл преобразовывать int в int.
> (int) $value;
эта команда ничего не делает так как ты не сохраняешь результат.
Класс назван неудачно. Можно подумать он работает с любыми формами, но на самом деле только с одной. Значит надо назвать его например StudentForm.
Ну и если ты делаешь задачу про студентов то наверно удобнее заполнять данные в объект-студента и проверять его. А не гонять туда-сюда массивы.
>Ну я просто до сих пор не понял почему так случается - почему он становиться пустым?
Я даже с проверкой isset($newLeader) сейчас сделал - он все равно выдает ошибку, только уже о том что нельзя обращаться к типу boolean
Не смешивай в одном файле php и HTML. Выноси html-код в шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Не используй echo для вывода.
Также, при исопльзовании mysqli надо проверять результат каждого вызова, чтобы получить информацию об ошибках, как я понимаю, а не пытаться продолжать выполнять скрипт.
То есть у тебя должно быть 2 файла, например list.php и templates/list.phtml
>>453658
> if(is_float($amount/100)){
это плохая проверка, так как is_float не проверяет является ли число нецелым. Он проверяет только тип под которым оно хранится. Как пример:
var_dump(is_float(2.0)); // true
Проверять лучше взятием остатка от деления на 100: $x % 100
> as $key => $value) {
Надо давать нормальные имена. Почиатй http://learn.javascript.ru/write-unmain-code#будьте-абстрактны-при-выборе-имени
> if($count>$value)$count=$value;
Надо ставить скобки после if и писать его в 3 строчки так как плохо читается и можно сделать ошибку.
> }else{
> continue;
Бессмысленная команда. Цикл продолжится в любом случае.
> $amount=$amount-$key*$count;
Тут можно использовать -=
Не смешивай в одном файле php и HTML. Выноси html-код в шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Не используй echo для вывода.
Также, при исопльзовании mysqli надо проверять результат каждого вызова, чтобы получить информацию об ошибках, как я понимаю, а не пытаться продолжать выполнять скрипт.
То есть у тебя должно быть 2 файла, например list.php и templates/list.phtml
>>453658
> if(is_float($amount/100)){
это плохая проверка, так как is_float не проверяет является ли число нецелым. Он проверяет только тип под которым оно хранится. Как пример:
var_dump(is_float(2.0)); // true
Проверять лучше взятием остатка от деления на 100: $x % 100
> as $key => $value) {
Надо давать нормальные имена. Почиатй http://learn.javascript.ru/write-unmain-code#будьте-абстрактны-при-выборе-имени
> if($count>$value)$count=$value;
Надо ставить скобки после if и писать его в 3 строчки так как плохо читается и можно сделать ошибку.
> }else{
> continue;
Бессмысленная команда. Цикл продолжится в любом случае.
> $amount=$amount-$key*$count;
Тут можно использовать -=
Можно по расширению — это быстрее всего. Если расширения нет или ты не уверен что оно правильное то вот
Есть такое расширение http://php.net/manual/ru/book.fileinfo.php
Есть linux команда file
Есть библиотека https://github.com/JamesHeinrich/getID3/ для чтения информации из медиафайлов
>>453746
https://php.net/manual/ru/tutorial.forms.php
>>453754
Когда ты тыкаешь сердечко, счетчик увеличивается, а в ленте твои друзья в соцсети видят ссылку на сайт. Они могут перейти по ней и например тоже кликнуть. То есть владельцы сайты пытаются поднять посещаемость. Но это работает только для популярных сайтов, на непопулярных эти кнопки с нулями/единицами только тормозят загрузку и все.
Ну и еще есть «расшарить» — это когда ссылка постится не только в ленту, но и на стенку и ее видят больше человек + поисковики.
>>453900
> if ($creditBalance < 5000);
Здесь точка с запятой завершает иф и то что идет дальше выполняется в любом случае, в том числе break
Будь внимателен к всяким значкам.
>>453997
> выплачено всего 55000 руб.
Должно быть около 61270
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
А твой алгоритм, если долг остался меньше 5000 не начисляет на него процент и комиссию.
Можно по расширению — это быстрее всего. Если расширения нет или ты не уверен что оно правильное то вот
Есть такое расширение http://php.net/manual/ru/book.fileinfo.php
Есть linux команда file
Есть библиотека https://github.com/JamesHeinrich/getID3/ для чтения информации из медиафайлов
>>453746
https://php.net/manual/ru/tutorial.forms.php
>>453754
Когда ты тыкаешь сердечко, счетчик увеличивается, а в ленте твои друзья в соцсети видят ссылку на сайт. Они могут перейти по ней и например тоже кликнуть. То есть владельцы сайты пытаются поднять посещаемость. Но это работает только для популярных сайтов, на непопулярных эти кнопки с нулями/единицами только тормозят загрузку и все.
Ну и еще есть «расшарить» — это когда ссылка постится не только в ленту, но и на стенку и ее видят больше человек + поисковики.
>>453900
> if ($creditBalance < 5000);
Здесь точка с запятой завершает иф и то что идет дальше выполняется в любом случае, в том числе break
Будь внимателен к всяким значкам.
>>453997
> выплачено всего 55000 руб.
Должно быть около 61270
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
А твой алгоритм, если долг остался меньше 5000 не начисляет на него процент и комиссию.
Ошибка на 493-й строке в httpd.conf. Так как ты его не запостил то непонятно какая именно.
Проверить файл httpd.conf можно из командной строки если ты умеешь ей пользоваться:
c:\apache\bin\httpd.exe -t
>>453984
для начала почитай http://www.phpinfo.su/articles/practice/shablony_v_php.html
Также если не читал прочти комментарии тут https://github.com/codedokode/pasta/blob/master/student-list.md
Не смешивай php и html. Лучше сделать отдельно php код с логикой и отдельно шаблон для вывода.
> Student::outAllStudent($pdo);
Статические методы это не ООП
> $student["name"]
Опять же на ООП не похоже
> /student.class.php
Советую не писать class так как в современном ООП коде 99% файлов это классы
> Поясните можно ли всё что идёт после этого блока который в самом вверху:
> Забросить в шаблон?
не надо
> можно ли закидывать foratch в шаблон
Можно. Только надо использовать версию с двоеточием https://php.net/manual/ru/control-structures.alternative-syntax.php
> <?= $student["name"];?>
htmlspecialchars где?
Ошибка на 493-й строке в httpd.conf. Так как ты его не запостил то непонятно какая именно.
Проверить файл httpd.conf можно из командной строки если ты умеешь ей пользоваться:
c:\apache\bin\httpd.exe -t
>>453984
для начала почитай http://www.phpinfo.su/articles/practice/shablony_v_php.html
Также если не читал прочти комментарии тут https://github.com/codedokode/pasta/blob/master/student-list.md
Не смешивай php и html. Лучше сделать отдельно php код с логикой и отдельно шаблон для вывода.
> Student::outAllStudent($pdo);
Статические методы это не ООП
> $student["name"]
Опять же на ООП не похоже
> /student.class.php
Советую не писать class так как в современном ООП коде 99% файлов это классы
> Поясните можно ли всё что идёт после этого блока который в самом вверху:
> Забросить в шаблон?
не надо
> можно ли закидывать foratch в шаблон
Можно. Только надо использовать версию с двоеточием https://php.net/manual/ru/control-structures.alternative-syntax.php
> <?= $student["name"];?>
htmlspecialchars где?
Лучше через return выходить если что-то не так.
>>454096
> Ну я просто до сих пор не понял почему так случается - почему он становиться пустым?
Поставь var_dump выше по коду чтобы понять на какой строчке он становится пустым и чему равны другие переменные. Посмотри что приходит в функцию, что делается с переменной дальше.
> Разве нельзя одну константу использовать в разных классах? А как тогда быть?
По идее можно сделать отдельный класс с константами. Или назвать их по-разному. Вообще, в твоем случае можно наверно просто имя класса использовать, я подумал.
В новом PHP есть такая штука http://php.net/manual/ru/migration55.new-features.php#migration55.new-features.class-name и можно писать просто
Manager::class
не заводя констант.
> Если писать в родительском классе self::CONSTANT - выдается ошибка что неизвестная константа.
Ты не должен из предка обращаться к константам потомка.
> как мне правильно унаследовать метод обращения к константе?
поясни подробнее, я не понял зачем тебе метод для обращения к константе.
>поясни подробнее, я не понял зачем тебе метод для обращения к константе.
Ну вот допустим в дочерних классах есть константа ИМЯ, я не хочу в каждом дочернем классе прописывать метод получения имени этой константы, тогда этот метод мне нужно прописать в родительском классе и далее унаследовать его.
Или так: Мне нужно получить имя каждого дочернего класса,
>я не хочу в каждом дочернем классе прописывать метод получения имени этой константы, тогда этот метод мне нужно прописать в родительском классе и далее унаследовать его.
Просто я сейчас понял что проблема заключается в том что я пишу self в родительском классе, и естественно получаю то его значение, а не то что в дочернем, не смотря на то что обращаюсь через дочерний.
проблема в том что ты используешь константы с одинаковыми именами и этим обеспечиваешь путаницу. Не используй одинаковые имена.
Константа это не поле. Ты не должен переопределять его в потомках.
Если тебе надо возвращать какую-то строку, разную для разных классов, удобно сделать в базовом классе абстрактный метод getsomething() и переопределять его в потомках. То что он абстрактный не позволит создать потомка не переопределив его.
И вообще, если ты хочешь заставить потомков что-то делать или возвращать, используй абстрактный метод. PHP не даст забыть его реализовать в потомке.
Спасибо за совет
>Статические методы это не ООП
Метод для вывода всех студентов, что бы не заводить объект для вызова одного метода и не заполнять его пустыми полями решил сделать статический метод.
>Опять же на ООП не похоже
Получил из метода в классе список всех студентов и преобразовал в массив через fetchAll, показалось что так удобнее, надо было в объект?
>htmlspecialchars где?
Кстати да, забыл использовать его, использовал strip_tags, trim и т.д. в методах, а как ты догодался? Или ты имеешь ввиду при передаче из шаблона надо переменные пропускать через htmlspecialchars?
По вот этому http://www.phpinfo.su/articles/practice/shablony_v_php.html так и не смог понять, вроде бы в шаблоне здесь используется пхп код, как его правильно разделять? В моём случае сама логика пхп скрипта в том что бы получить с метода список всех студентов, можно ли всё остальное засунуть в шаблон (может быть немного не в том виде в котором я сделал) а оставить только само получение этого списка?
> что бы не заводить объект для вызова одного метода
В этом ничего страшного нет
> Получил из метода в классе список всех студентов и преобразовал в массив через fetchAll, показалось что так удобнее, надо было в объект?
Массив объектов-студентов наверно. у тебя же все равно есть класс Студент?
> Или ты имеешь ввиду при передаче из шаблона надо переменные пропускать через htmlspecialchars?
Ты читал комментарии к заданию? Там и ссылка есть на урок про XSS https://github.com/codedokode/pasta/blob/master/security/xss.md
Экранировать при вставке в базу неправильная идея. Это неграмотно. Так как данные в базе могут использоваться не только для вывода в HTML но и в других целях.
> использовал strip_tags, trim
Потому что ты не знаешь как делать правильно и просто ставишь все функции подряд. Это неправильно.
> вроде бы в шаблоне здесь используется пхп код, как его правильно разделять?
Код в шаблоне только для вывода данных. Не для их получения, подготовки, обработки и тд.
Статические методы там где надо использовать обычные это плохо. Ты не можешь например создать 2 копии объекта с разными настройками из-за них. также ты явно прописываешь класс:
SomeClass::someMethod
И никак нельзя подменить его на другой, а в случае с объектами можно передавть объект любого класса. У меня есть урок про это, но он не совсем для начинающих: https://gist.github.com/codedokode/e1d31a31b37d5f635057
>В этом ничего страшного нет
Проблема в том что в самом классе у меня 8 его свойств (name, email и т.д.) А передать мне надо только объект $pdo для вывода всех студентов, больше ничего не надо, поэтому мне показалось что создавать что то такое:
$student = new Student("","","","","","","",""$pdo);
Будет как-то неправильно. Или так делают?
8 аргументов это конечно плохо. делают так.
$student = new Student;
$student->name = 'Ivan';
или
$student = new Student;
$student->setName('Ivan');
И я не понимаю, зачем ты в Студента передаешь pdo? урок про работу с БД читал? https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
Сейчас прочитал, спасибо, кажется понял как правильно делать, до этого приходилось придумывать, у меня вот такая верхушка класса была:
class Student {
public $yearBorn;
public $site;
public $pol;
public $pdo; public $name;
public $lastname;
public $groupNumber;
public $email;
public $point;
function __construct($name, $lastname, $groupNumber, $email, $point, $yearBorn, $site, $pol, $pdo) {
$this->name = $name;
$this->lastname = $lastname;
$this->groupNumber = $groupNumber;
$this->email = $email;
$this->point = $point;
$this->yearBorn = $yearBorn;
$this->site = $site;
$this->pol = $pol;
$this->pdo = $pdo;
}\t
Не знал как по другому использовать базу данных внутри класса, приходилось передавать через __construct объект PDO из вне, так совсем неверно да? Теперь то буду пользоваться дата мапером.
Сейчас прочитал, спасибо, кажется понял как правильно делать, до этого приходилось придумывать, у меня вот такая верхушка класса была:
class Student {
public $yearBorn;
public $site;
public $pol;
public $pdo; public $name;
public $lastname;
public $groupNumber;
public $email;
public $point;
function __construct($name, $lastname, $groupNumber, $email, $point, $yearBorn, $site, $pol, $pdo) {
$this->name = $name;
$this->lastname = $lastname;
$this->groupNumber = $groupNumber;
$this->email = $email;
$this->point = $point;
$this->yearBorn = $yearBorn;
$this->site = $site;
$this->pol = $pol;
$this->pdo = $pdo;
}\t
Не знал как по другому использовать базу данных внутри класса, приходилось передавать через __construct объект PDO из вне, так совсем неверно да? Теперь то буду пользоваться дата мапером.
Извиняюсь в приведенном коде кое-что съехало, у меня мышка продавленная, свойства местами поменялись, но кажется суть видна.
не могу понять в чем таблы, постоянно выдает более 2-3 ошибок, анон в чем проблема может быть? http://ideone.com/e7C9ea
Кавычки ты не закрыл в 11 ой строке.
А ещё ты скобки забыл.
У меня есть таблица (смотри пик) цен на услуги полиграфической компании. Скажем, печать визиток. Задача состоит в том, чтоб сделать систему, где клиент нажимает на цену (синего цвета) и получает попап со строкой-подтверждением. Строка составляется из данных таблицы.
К примеру: мне нужно 500 визиток с Опцией #1.
Я нажимаю на цену 740 и в модальном окне у меня появляется строка: "Вы купили 500 визиток с Опцией #1 по цене 700 денег.
Можно вручную прописать все варианты типа (row-1, cell-5) + (row-3, cell-1) + (row-3, cell-5), но это же неправильно, хотя логика верна.
Таблица и модальное окно у меня уже реализовано. Все данные в таблице вынесены как параметры в бэк-энд. Мне нужна помощь с комбинацией значений. Как это решить на php?
Заранее благодарен.
Выходишь на улицу, ищешь самую грязную лужу. Срёшь в неё. Раздеваешься, катаешься в этой луже, потом выпиваешь из нее всё до конца.
Подготовка окончена.
кушать то же хочется
>>454107
Ваше благородство не знает границ, а интеллект - систем подсчёта.
Сделал как сказал всесветлейший Оп Знаю, что скорее всего не так, но попытаться стоит, т.е.:
1) Задал переменные.
2) Начал цикл.
3) Внутри цикла подсчитал долг.
4) Открыл иф: Если долг меньше чем 5(пять) тыс. (тысяч), то приравниваю ежемесячный платёж = долг, вывожу, с меня хватит и брейк. Ежели нет, то плачу ежемесячный платёж. А ежемесячный платёж у меня сколько? Пять тысяч. уже с ума схожу.
Так вот. Где мой ограниченный стенками черепа разум допустим ошибку или проглядел очевидные для магистров оккультного цифрового знания вещи? На горохе уже постоял, плоть укротил, жду ответа.
http://ideone.com/9KW1LY
> Где мой ограниченный стенками черепа разум допустим ошибку или проглядел очевидные для магистров оккультного цифрового знания вещи?
В формуле расчета. Точнее это не твой разум, это хитрый оп там её оставил. Выплачивать долг, а затем проверять оставшуюся к выплате сумму - противоречит логике. Нужно делать наоборот. Но для этого придется разбить формулу на части.
Спасибо за этот туманный и загадочный ответ, мессир. Буду ломать голову, если нихуя не выйдет - за советом приду только завтра, чтобы не примелькаться.
Да не особо он и туманный, вот тебе алгоритм действий:
Начисляем проценты к кредиту (НО ни в коем случае от него ничего не отнимаем)
Проверяем не меньше ли кредит нашей ежемесячной выплаты. Ну а далее в зависимости от проверки отнимаем что-то от оставшейся суммы кредита. Все просто, осталось только выразить это в коде.
Видимо ищут того, кто подходит хоть по одному из этих пунктов. И зарплата поди соответствующая, 20-30к.
Спасибо тебе, медиум сетевой сферы! Так долго не отвечал потому что смотрел менталиста по тв3.
http://ideone.com/FIohrE
Я ещё у Опа хотел спросить, когда думал, что получится сделать его способом, почему именно такая логика, потому что это правда странно. Но Оп - педагогический гений и его пути неисповедимы, аминь
http://ideone.com/UrlLuq
Считалка:
http://ideone.com/WwRT56
Проверти плиз.
И подскажите как решить задачку про банкомат усложнением с купюрами по 200 р и 2000 р?
Выглядит круто, ты явно умнее меня.
>Это лучше вынести из департамента. А то у тебя нельзя просто создать объект работника и добавить в департамент. Лучше сделать функцию вида
>addEmployee(Employee $employee)
Мне тогда нужно перекроить по новой два класса? Суть в том, что у меня все неправильно с точки зрения ООП сделано как раз? Я должен делать каждый класс независимым? Я просто не хотел делать для каждого класса работника функцию добавления этого работника, а хотел вот таким вот трюком сразу заполнять большие департаменты.
Я вообще немного не понял что тут должно быть: addEmployee(Employee $employee)
что тут в скобках типа передается? Это такой тайпхинтинг просто? что в функцию долден передаваться уже готовый объект?
> лучше использовать древний проверенный способ. Когда имя для скачивания указывается в конце URL
ОП, я тупой я не понялхотя старался.
файлы решил сохранять не под именем-белибердой. А просто приписывать к имени файла номер id. Вот так 23_picture.jpg
На данный момент такие проблемы.
Закачиваю файл с русским именем, имя превращается в кракозябры.
При попытке скачивать ничего не происходит. Решение сам не нагуглил.
Почти все советуют не сохранять в кириллице или заменять кириллицу на транслит.
Ты советовал.
>лучше использовать древний проверенный способ. когда имя для скачивания указывается в конце URL
Поделись ссылкой где про это написано так, что б даже я смог уловить суть.
Так я тоже неимоверно благодарен, просто когда ты дал мне это замечание я не понимал что значит "платить" здесь. Здесь забавный момент, вот ты мне сказал это, потом в другом посте Оп примерно то же самое сказал (Хотя я запутался, кто здесь кто, но не важно). Я сижу и думаю "где здесь "плата?". Здесь нет ничего с табличкой "Плата". И я, внимание, прихожу к выводу: "Так плата то это зачисление в PlaymentTotal!". Т.е. думаю что когда я добавляю число в общий платёж и он выводится в stdout то это "Плата". ЛОГИЧНО? Лол.
И только вот сегодня я понял что платёж это именно вычет ежемесячный платы и более того - нужно платить в каждом отдельном ифе по разному.
Такие дела. Ещё раз всем спасибо.
Не, надо руками. Я же не прошу все мне по полочкам расписать, направьте, куда копать и смотреть чего. У ОПа есть что по этой части?
Я тупой, не понимаю в эти задачки, дошел до 3-4 и всё, код как-бы нормальный сам по себе, но работает через раз, и то не всё. вот думаю почитать что-то, чтобы заработало всё.
>У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него.
Выкладывай решения на проверку и получишь советы и замечания. Также, если ты не можешь решить задачу, запости ссылку на уже написанный код и напиши что именно непонятно —получишь подсказку.
Такое положение дел меня огорчает.
> Не знал как по другому использовать базу данных внутри класса, приходилось передавать через __construct объект PDO из вне, так совсем неверно да?
В этом ничего неверного нет. Непонятно только зачем ты PDO в класс Student передаешь. зачем этому классу доступ к БД? Ты прочитал про паттерны для работы с Бд по ссылке?
>>454371
У тебя там условие выигрыша странное:
> if (($anonSum < 5) && ($compSum > 5)) {
> echo "ПК выиграл!";
А если у анона 2 очка, а у ПК 3 очка, то получается никто не выиграл?
По моему условие должно быть в виде «если у компьютера больше очков чем у человека».
>>454438
А чем документация плоха? Не знаю, попробуй погуглить.
>>454528
Плохо, что ты не написал что ты умеешь и знаешь, что до этого делал, может ты с Symfony 2 знаком, а может тебе сначала надо научиться с формами работать. Трудно так давать советы, не зная уровень знаний.
Регистрация: добавление пользователя в базу данных
Авторизация: проверка логина/пароля на наличие в БД и если так, помечаем пользователя залогиненным с помощью сессии или кук. Стоит помнить что сессия это временное хранилище и неактивная сессия умирает через 20-30 минут. Если ты хочешь чтобы залогиненность сохранялась дольше надо либо использовать куки либо сессию+ куки. из которых она восстанавливается.
Вообще объяснять тут можно долго, потому я попробую дать ссылки для изучения (хотя по моему хороших объяснений найти трудно):
http://www.internet-technologies.ru/articles/article_2077.html (тут плохой и устаревший код но идею понять можно)
http://habrahabr.ru/post/13726/ (используется устаревшее расширение mysql и код отстойный но идею понять можно. Привязку к IP лучше не делать так как есть динамический IP и будет постоянно разлогинивать)
http://lezhenkin.ru/examples/php/reg-auth-users/ (используется устаревший mysql, хотя в остальном код не плох)
http://programmer-weekdays.ru/archives/125
Во всех этих примерах код низкокачественный и приведен только для объяснения логики, так что не копируй его а пиши сам.
также есть уже готовые библиотеки для реализации логина, например Sentry (хотя у меня некоторые претензии к примерам кода там и статические методы это не лучшая идея): http://www.ibm.com/developerworks/ru/library/se-sentry/
> Не знал как по другому использовать базу данных внутри класса, приходилось передавать через __construct объект PDO из вне, так совсем неверно да?
В этом ничего неверного нет. Непонятно только зачем ты PDO в класс Student передаешь. зачем этому классу доступ к БД? Ты прочитал про паттерны для работы с Бд по ссылке?
>>454371
У тебя там условие выигрыша странное:
> if (($anonSum < 5) && ($compSum > 5)) {
> echo "ПК выиграл!";
А если у анона 2 очка, а у ПК 3 очка, то получается никто не выиграл?
По моему условие должно быть в виде «если у компьютера больше очков чем у человека».
>>454438
А чем документация плоха? Не знаю, попробуй погуглить.
>>454528
Плохо, что ты не написал что ты умеешь и знаешь, что до этого делал, может ты с Symfony 2 знаком, а может тебе сначала надо научиться с формами работать. Трудно так давать советы, не зная уровень знаний.
Регистрация: добавление пользователя в базу данных
Авторизация: проверка логина/пароля на наличие в БД и если так, помечаем пользователя залогиненным с помощью сессии или кук. Стоит помнить что сессия это временное хранилище и неактивная сессия умирает через 20-30 минут. Если ты хочешь чтобы залогиненность сохранялась дольше надо либо использовать куки либо сессию+ куки. из которых она восстанавливается.
Вообще объяснять тут можно долго, потому я попробую дать ссылки для изучения (хотя по моему хороших объяснений найти трудно):
http://www.internet-technologies.ru/articles/article_2077.html (тут плохой и устаревший код но идею понять можно)
http://habrahabr.ru/post/13726/ (используется устаревшее расширение mysql и код отстойный но идею понять можно. Привязку к IP лучше не делать так как есть динамический IP и будет постоянно разлогинивать)
http://lezhenkin.ru/examples/php/reg-auth-users/ (используется устаревший mysql, хотя в остальном код не плох)
http://programmer-weekdays.ru/archives/125
Во всех этих примерах код низкокачественный и приведен только для объяснения логики, так что не копируй его а пиши сам.
также есть уже готовые библиотеки для реализации логина, например Sentry (хотя у меня некоторые претензии к примерам кода там и статические методы это не лучшая идея): http://www.ibm.com/developerworks/ru/library/se-sentry/
Это логичнее решать на JS чтобы отображать цену без перезагрузки страницы и отправки запросов. Но можно делать и на стороне php, с лишними запросами.
Решить можно помещением цен из таблицы в массив и нехитрым скриптом суммирующим нужные значения. Я не очень понимаю, в чем проблема, потому если тебе что-то непонятно, напиши подробнее. Я также предполагаю что ты знаешь сам язык PHP и тебе не надо объяснять что такое массивы, циклы, if, функции и т.д.
>>454561
Ты кстати знаешь что с помощью 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 строчку вниз под логотип.
Опять же смотри картинку.
Это все надо исправить. Если есть какие-то затруднения или что-то непонятно, спрашивай.
Это логичнее решать на JS чтобы отображать цену без перезагрузки страницы и отправки запросов. Но можно делать и на стороне php, с лишними запросами.
Решить можно помещением цен из таблицы в массив и нехитрым скриптом суммирующим нужные значения. Я не очень понимаю, в чем проблема, потому если тебе что-то непонятно, напиши подробнее. Я также предполагаю что ты знаешь сам язык PHP и тебе не надо объяснять что такое массивы, циклы, if, функции и т.д.
>>454561
Ты кстати знаешь что с помощью 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 сделать это плавным.
Вот примеры для вдохновения:
http://ianlunn.github.io/Hover/
http://tympanus.net/Development/CreativeButtons/
http://tympanus.net/Development/IconHoverEffects/
http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations
http://tympanus.net/Tutorials/OriginalHoverEffects/index.html
http://tympanus.net/Tutorials/CircleHoverEffects/index.html
http://www.inserthtml.com/demos/css/button-styles/
http://www.cssdesignawards.com/articles/round-up-38-neat-css-js-hover-effects/101/
Ну и кнопку See Portflio надо сделать реагирующей на наведение.
Это требования к администратору. Слова php там нет.
>>454585
> выплачено всего 54138.172065718 руб.
А должно быть 61к. Это из-за того что ты вот тут
> $creditBalance = ($creditBalance $percent) + $servicePayment - $monthlyPayment;
Сразу вычитаешь 5000 независимо от того какой выйдет остаток. Это непраивльно.
>>454592
Он имеет в виду строчку
$creditBalance = ($creditBalance $percent) + $servicePayment - $monthlyPayment;
лучше не брать код из учебника с ошибкой, а писать самому.
>>454660
Считает правильно, но давай посмотрим внимательно на код. Безупречен ли он? Нет ли в нем повторов? Нельзя ли отрезать от него лишнее? Конечно, можно. Смотри сам, эти строки повторяются:
> $paymentTotal = ($paymentTotal + $monthlyPayment);
> $creditBalance = ($creditBalance - $monthlyPayment);
> echo "{$month} месяц спустя: долг = {$creditBalance} руб
Твоя работа пока не закончена. Отсеки лишнее. Избавься от повторов.
>>454714
О, действительно. мой совет мог быть не очень понятным. Под «платить» я имею в виду конечно уменьшение остатка долга, увеличение общей суммы выплаченного и вывод надписи.
Это требования к администратору. Слова php там нет.
>>454585
> выплачено всего 54138.172065718 руб.
А должно быть 61к. Это из-за того что ты вот тут
> $creditBalance = ($creditBalance $percent) + $servicePayment - $monthlyPayment;
Сразу вычитаешь 5000 независимо от того какой выйдет остаток. Это непраивльно.
>>454592
Он имеет в виду строчку
$creditBalance = ($creditBalance $percent) + $servicePayment - $monthlyPayment;
лучше не брать код из учебника с ошибкой, а писать самому.
>>454660
Считает правильно, но давай посмотрим внимательно на код. Безупречен ли он? Нет ли в нем повторов? Нельзя ли отрезать от него лишнее? Конечно, можно. Смотри сам, эти строки повторяются:
> $paymentTotal = ($paymentTotal + $monthlyPayment);
> $creditBalance = ($creditBalance - $monthlyPayment);
> echo "{$month} месяц спустя: долг = {$creditBalance} руб
Твоя работа пока не закончена. Отсеки лишнее. Избавься от повторов.
>>454714
О, действительно. мой совет мог быть не очень понятным. Под «платить» я имею в виду конечно уменьшение остатка долга, увеличение общей суммы выплаченного и вывод надписи.
Лиличка
Работает верно, но код требует улучшений.
нахождение максимальной длины можно сделать без цикла за счет функции 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.
Лиличка
Работает верно, но код требует улучшений.
нахождение максимальной длины можно сделать без цикла за счет функции 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.
> как решить задачку про банкомат усложнением с купюрами по 200 р и 2000 р?
Это задача о ранце и у нее есть известный алгоритм решения:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D0%BD%D1%86%D0%B5
http://informatics.mccme.ru/mod/book/view.php?id=815
http://algoritm-rukzaka.narod.ru/
Там есть эффективный способ решения, а также можно решать ее (гораздо более медленно) полным перебором. Я опишу тут полный перебор.
Допустим есть сумма 16000. Чтобы определить как ее выдать мы должны перебрать все возможные количества купюр:
5000-е: от 0 до 3 (с учетом имеющегося запаса)
2000-е: от 0 до 8 (с учетом запаса и числа более старших)
...
100-е: от 0 до 160 (с учетом запаса и числа более старших)
«С учетом запаса» значит что если у нас всего одна 5000-я то рассматривать варианты размена где две или три таких купюры нет смысла.
«с учетом более старщих» значит что если мы допустим проверяем вариант в котором 3 5000-х купюры, то число 100-х меняется только от 0 до 10.
Полный перебор значит что мы должны проверять все возможные комбинации числа купюр. С учетом запаса и с учетом общей суммы разумеется.
Полный перебор можно реализовать рекрсией, когда за один вызов функции мы проверяем все возможные количества купюры определенного номинала. Примерно так:
перебор_5000х (сумма, запас) {
для количества от 0 до минимального из (запас 5000-х, сумма / 5000) {
делаем перебор 2000х(остаток суммы, запас);
}
}
Далее уже идут оптимизации. Например перебирать число купюр выгоднее не от 0 до максимального, а в обратную сторону, от максимального до 0, так мы скорее найдем верное число.
ну или ты можешь использовать оптимальный алгоритм из задачи о ранце.
Если что задавай вопросы.
> как решить задачку про банкомат усложнением с купюрами по 200 р и 2000 р?
Это задача о ранце и у нее есть известный алгоритм решения:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D0%BD%D1%86%D0%B5
http://informatics.mccme.ru/mod/book/view.php?id=815
http://algoritm-rukzaka.narod.ru/
Там есть эффективный способ решения, а также можно решать ее (гораздо более медленно) полным перебором. Я опишу тут полный перебор.
Допустим есть сумма 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 не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
> что в функцию долден передаваться уже готовый объект?
да
> Мне тогда нужно перекроить по новой два класса?
Скорее всего да
> Суть в том, что у меня все неправильно с точки зрения ООП сделано как раз?
У тебя сделано не очень удобно и департамент занимается не своим делом (созданием работников). Не то чтобы это совсем плохо, но можно сделать гораздо лучше. Код с независимыми классами будет чище и универсальнее.
А так у меня есть объект-работник, как добавить его в Департамент? Никак. Плохо.
> Я должен делать каждый класс независимым?
Смотря в каком смысле понимать независимость. В данной задаче думаю независимость в том что Департамент не создает работников сам, а оставляет эту задачу внешнему коду.
> Я просто не хотел делать для каждого класса работника функцию добавления этого работника
Зачем? Сделай одну функцию добавляющую работника любого класса в департамент:
$dep->addEmployee(Employee $employee)
> Это такой тайпхинтинг просто?
да
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
> что в функцию долден передаваться уже готовый объект?
да
> я не понял
Браузер при скачивании файла берет имя из последнего сегмента ссылки по которой идет скачивание. Если ты открываешь ссылку
http://example.com/files/123/hello.world
и по этому URL отдается файл то браузер сохранит его с именем hello.world
Если мы возьмем какой-нибудь файл на rghost, например http://rghost.ru/6vZkZdKVM и посмотрим инспектором (Ctrl + Shift + i) код кнопки «скачать» то мы увидим:
<a href="http://rghost.ru/download/6vZkZdKVM/78d35a45b6f25989133d9a145f11f82e2827faab/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%20%D0%BE%D1%82%202015-03-25%2007:03:10.png" class="btn large download js-download-link-update" data-update-url="/files/6vZkZdKVM/link" rel="nofollow" title="Скачать Снимок экрана от 2015-03-25 07:03:10.png">Скачать</a>
Адрес в href закодирован процентным кодированием ( https://ru.wikipedia.org/wiki/URL#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_URL ). Если мы его раскодируем (например тут http://www.codenet.ru/services/urlencode-urldecode/ ), то получим
http://rghost.ru/download/6vZkZdKVM/78d35a45b6f25989133d9a145f11f82e2827faab/Снимок экрана от 2015-03-25 07:03:10.png
Видишь — ссылка для скачивания составлена так чтобы в конце шло имя файла и при скачивании браузер его использовал.
Соответвенно чтобы при скачивании файла задать ему имя, надо добавлять это имя в конец ссылки.
> А просто приписывать к имени файла номер id. Вот так 23_picture.jpg
В этом случае php файл остается php файлом — довольно опасно.
> Закачиваю файл с русским именем, имя превращается в кракозябры.
На windows файловые функции ждут имя файла не в utf-8 а в win-1251. надо либо перекодировать (причем только под windows) либо использовать только латинницу.
> При попытке скачивать ничего не происходит
Как выглядит ссылка? Что пишет отладчик в браузере на вкладке network?
> Поделись ссылкой где про это написано так, что б даже я смог уловить суть.
Я выше привел примеры. Если что-то непонятно, уточняй. Если кратко то надо чтобы ссылка скачивания файла закнчивалась его именем.
> я не понял
Браузер при скачивании файла берет имя из последнего сегмента ссылки по которой идет скачивание. Если ты открываешь ссылку
http://example.com/files/123/hello.world
и по этому URL отдается файл то браузер сохранит его с именем hello.world
Если мы возьмем какой-нибудь файл на rghost, например http://rghost.ru/6vZkZdKVM и посмотрим инспектором (Ctrl + Shift + i) код кнопки «скачать» то мы увидим:
<a href="http://rghost.ru/download/6vZkZdKVM/78d35a45b6f25989133d9a145f11f82e2827faab/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%20%D0%BE%D1%82%202015-03-25%2007:03:10.png" class="btn large download js-download-link-update" data-update-url="/files/6vZkZdKVM/link" rel="nofollow" title="Скачать Снимок экрана от 2015-03-25 07:03:10.png">Скачать</a>
Адрес в href закодирован процентным кодированием ( https://ru.wikipedia.org/wiki/URL#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_URL ). Если мы его раскодируем (например тут http://www.codenet.ru/services/urlencode-urldecode/ ), то получим
http://rghost.ru/download/6vZkZdKVM/78d35a45b6f25989133d9a145f11f82e2827faab/Снимок экрана от 2015-03-25 07:03:10.png
Видишь — ссылка для скачивания составлена так чтобы в конце шло имя файла и при скачивании браузер его использовал.
Соответвенно чтобы при скачивании файла задать ему имя, надо добавлять это имя в конец ссылки.
> А просто приписывать к имени файла номер id. Вот так 23_picture.jpg
В этом случае php файл остается php файлом — довольно опасно.
> Закачиваю файл с русским именем, имя превращается в кракозябры.
На windows файловые функции ждут имя файла не в utf-8 а в win-1251. надо либо перекодировать (причем только под windows) либо использовать только латинницу.
> При попытке скачивать ничего не происходит
Как выглядит ссылка? Что пишет отладчик в браузере на вкладке network?
> Поделись ссылкой где про это написано так, что б даже я смог уловить суть.
Я выше привел примеры. Если что-то непонятно, уточняй. Если кратко то надо чтобы ссылка скачивания файла закнчивалась его именем.
Я не могу понять, что это за белый отступ справа и что с ним делать. Указывать width 100% для каждого блока? Тогда блоки будут выходить за пределы экрана.
>а сайтах обычно делают середину тянущейся в ширину от и до определенного размера
>У тебя ничего не тянется.
А как же media правило для services? Надо как-то по другому делать?
Вы видите копию треда, сохраненную 12 апреля 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.