Задать вопрос
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • Дополнительный заработок программисту?

    При всем моем уважении, но такой подход крайне деструктивен для жизни.

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

    2) Поэтому рационально будет идти по двум путям:

    - увеличивать доход на своей текущей работе (либо при смене работы)
    - идти в полукоммерческую схему со своим продуктом.

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

    p.s. у меня в свое время была работа, поддержка ряда клиентов в it-инфрастуктуре, пару клиентов на поддержке сайтов, плюс контракты на продвижение сайтов. Просто вся жизнь превратилась в работу, как смог накопить на квартиру, сразу же от этого всего отказался в пользу жирной работы, и своих проектов.
    Ответ написан
    2 комментария
  • Зачем изучать несколько языков программирования(c++, java)?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Во-первых, гипотеза лингвистической относительности утверждает, что чем больше языков знаешь, тем гибче и богаче твой логический аппарат. По своему опыту могу сказать, что это правда. Например изучение Lisp'ов существенно расширило мои возможности в других языках. Но мой опыт и мнение не так авторитетны, как авторов всемирно известного бестселлера "Программист-прагматик" - Эндрю Ханта и Дэвида Томаса, которые пишут: «Изучайте по крайней мере один новый язык ежегодно. Разные языки решают одни и те же проблемы разными способами. Изучив несколько разных подходов, вы сможете расширить свой кругозор и не погрязнуть в рутине.»

    Во-вторых, рано или поздно профессиональный рост java-программиста, например, неизбежно приводит его к необходимости глубоко понимать работу компилятора и виртуальной машины, а это невозможно без знания C++, на котором они написаны.

    В-третьих, java-программист свободно лазающий за ответами в исходники JVM, способный дебажить сборщик мусора, писать JNI-библиотеки и использовать Compiler API для метапрограммирования имеет больше предложений работы и более выгодные условия.
    Ответ написан
    4 комментария
  • Как в ролевой модели (User - Roles) реализовать бан?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Вы - описали роли пользователя.
    Хотите - создать роли ACL (access level system), понижающие действующие привелегии.

    Сначала создайте ACL под все роли пользователей, что Вы описали (USER_ACL, MODERATOR_ACL и т.д.). Это таблица с привелегиями (битовая "маска" со степенями двойки): 1,2,4,8,16,32,64 и т.д. Сумма этих значений даёт число, однозначно определяющее ACL для доступа к различным функциям.

    Затем - создайте различные BAN-наборы (ACL по тем же кретериям).
    BAN_CHAT, BAN_EDIT, BAN_DELETE, BAN_REOWNER и т.д.

    И из действующего *_ACL вычитаете BAN_*.

    Полученное - и будет действующие ACL, но с ограничениями по BAN-маске.
    (меньше или равно 0 - значит вообще без каких-либо прав)
    Ответ написан
    3 комментария
  • Как правильно подключать js/css в Symfony4?

    @bkosun
    Аналогично, пример подключения bootstrap:

    assets/dashboard/js/dashboard.js
    var $ = require('jquery');
    require('bootstrap');


    assets/dashboard/scss/dashboard.scss
    @import "~bootstrap/scss/bootstrap";

    webpack.config.js
    var Encore = require('@symfony/webpack-encore');
    
    Encore
        .setOutputPath('public/assets/')
        .setPublicPath('/assets')
        .cleanupOutputBeforeBuild()
        .enableSourceMaps(!Encore.isProduction())
        .addEntry('js/dashboard', './assets/dashboard/js/dashboard.js')
        .addStyleEntry('css/dashboard', './assets/dashboard/scss/dashboard.scss')
        .enableSassLoader(function(sassOptions) {}, {
            resolveUrlLoader: false
        })
        .autoProvidejQuery()
    ;
    
    module.exports = Encore.getWebpackConfig();
    Ответ написан
    Комментировать
  • С чего начать админку на symfony?

    @ArtemioVegas
    php developer
    Можно попробовать EasyAdminBundle
    Полегче чем Соната будет.
    + Есть туториал от KNPUniversity
    Ответ написан
    Комментировать
  • Взломан skype. Как это случилось?

    sayber
    @sayber
    Да, я программирую на PHP и еще асинхронно!
    Как то в 2003г. я жил с девушкой. Мы оба были геймерами. Ну я естественно тогда начинал свой путь программирования.
    Был у меня сайтик на обычном хостинге. По тем временам, код был сильно защищен. В один из прекрасных дней я увидел в логах необычное поведение. Прошерстил код, нашел спамбота.
    Конечно все почистил и т.д.

    Но мне стало интересно как и вам, кто и как меня взломал. Своими скромными силами я не смог определить.
    В итоге создал в корне сайта файлик forHacker.txt
    В нем задал вопрос - собственно как вы меня хакнули?
    на следующий день в аську стучится человек, я спрашиваю
    - Мол чего вам надобно? - в ответ
    - Товарищ Иван, вы же сами просили меня вам рассказать как я вас хакнул
    - Спасибо что откликнулись, просветите плз
    - Ваша девушка Света была не аккуратна, скачала мой файлик. В связи с чем я смог получить доступ к ее компу. Далее по локальной сети обнаружил доступ к вашему. Подсадил кейлогер и просто подождал ввода пароля.
    ....
    Всего вам хорошего и удачи. Ваш сайт оставляю в покое =)

    Это примерный наш разговор.
    Так что способов получения ваших данных велик )
    Ответ написан
    Комментировать
  • Java на mac лагает, и не запускается, что делать?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Что теперь делать - незаню.

    Взять учебник.

    $ javac Untitled-1.java
    $ java HelloWorld
    Ответ написан
    Комментировать
  • Стал работать по часам и обнаружил, что выходит 6 часов в день. Это нормально?

    Maksclub
    @Maksclub Куратор тега Карьера в IT
    maksfedorov.ru
    Не забывайте, НИКОГДА не забывайте, что в ваше рабочее время входит не только полезная работа (написание кода):
    - разобраться с той или иной информацией, изучение проблемы
    - анализ и преоктирование
    - просто изучение нового (подходы, библиотеки)
    - отдых в определенном проценте (не считая обеда)

    Если за вас это не делает работодатель, делайте за него.
    В будущем, если будете управлять коллегами — делайте это для них.

    Главное для любого человека — он сам, никакая зп не переплюнет эгоизм, помните это.
    Ответ написан
    Комментировать
  • Symfony 3: Как правильно создать маршрут (через аннотации) чтобы он работал?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Судя по всему вы пробуете зайти на страницу через prod окружение, а чистите кеш - для dev
    Попробуйте
    project/app_dev.php/any
    Либо
    php bin/console cache:clear --no-warmup --env=prod
    Ответ написан
    Комментировать
  • Laravel vs Yii vs Symfony для проект требовательного к скорости?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    Писать хороший код надо для проекта требовательного к скорости.

    Разница в скорости пустого фреймворка из коробки станет несущественной как только вы напишите первые строки своего кода с бизнес логикой.
    Ответ написан
    2 комментария
  • Нужно ли регистрировать Twig Extensions в конфиге services.yml? У меня работает и так. Новая фича или баг?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    В версии 3.3 присутствует PSR-4 service discovery и autowire и autoconfigure опции которые автоматически регистрируют сервисы, резолвят зависимости и конфигурируют теги
    Вот код, который за это отвечает: https://github.com/symfony/symfony-standard/blob/3...

    Я бы рекомендовал использовать эти возможности, они сильно ускоряют разработку. Из минусов: проседаение в скорости генерации страниц в дебаг режиме из-за перегенерации контейнера.
    Ответ написан
    Комментировать
  • Стоит ли изучать symfony 1.4 для трудоустройства?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Сказал, что они делают сайты на symfony 1.4.
    После этого дальше можно не читать...
    Он сам себя дурит: вместо того, чтобы перевести проект на актуальную версию, он ищет тех, кто готов учить старьё ради того, чтобы не потерять клиента.

    От подобных предложений - сразу БЕГИТЕ.
    Ответ написан
    Комментировать
  • Какие библиотеки, плагины и прочее для верстки вы используете в своих проектах?

    SergGrbanoff
    @SergGrbanoff
    UX/UI Desinger, Front-End Developer
    Фреймворки, библиотеки и плагины для верстки сайта.

    1. Bootstrap - самый популярный HTML, CSS, и JS фреймворк в мире для разработки отзывчивых, mobile-first проектов в вебе.

    2. slick - Адаптивный слайдер для сайта

    3. Owl Carousel 2 - красивый, отзывчивый карусельный слайдер

    4. Fotorama - плагин для создания галереи на сайте

    5. MagnificPopup - плагин для создания модальных окон

    6. FancyBox - построениe всплывающих окон

    7. Mmenu - мобильное меню


    8. bxSlider - отзывчивый jQuery-слайдер для контента


    9. Fullscreen Slit Slider - слайдер с интересной анимацией

    10. parallax.js - эффект Parallax

    Первая 10-ка
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

    Это далеко не полный список требований, очень много зависит от проекта в целом и от принципов, заложенных в нем. Для больших мредж реквестов 200 комментариев к коду - это ок. Дерзайте.

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • На чем лучше и быстрее написать парсер (PHP)?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    DiDom: https://github.com/Imangazaliev/DiDOM

    + высокая скорость работы (сравнение с другими парсерами)
    + хорошая дока
    + большое количество поддерживаемых селекторов
    + самое главное - тесты

    Простой пример:

    $document = new Document('http://www.example.com/', true);
    
    echo $document->first('title::text');


    Чуть посложнее - парсим все ссылки:

    $links = $document->find('a[href]::attr(href)');
    
    var_dump($links);


    Еще сложнее - получить адреса всех ссылок-картинок:

    $links = $document->find('a[href]:has(img)::attr(href)');
    
    var_dump($links);


    Другие варианты:
    - Symfony DomCrawler
    - Zend Dom Query
    Ответ написан
    3 комментария
  • Как правильно разрабатывать web проект на примере yii2?

    @LAV45
    Как раз на форуме Yii обсуждали данную тему.
    yiiframework.ru/forum/viewtopic.php?f=4&t=29291
    Я там приводил пример выгрузки кода на test и prod сервера.
    Dmytro Karpovych , думаю тебе будет нитересна это обсуждение.
    Ответ написан
    Комментировать
  • Как вывести api яндекс метрики через php?

    @GEOgraf
    недавно тоже нужна была статистика, вот написал класс.
    может поможет...
    class yandex{
    
    	const CLIENT_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    	const CLIENT_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    	const COUNTER_ID = '00000000';
    
    	public static function getStat(){
    		$token = self::auth();
    
    		if($token){
    			return self::getData(
    				'https://api-metrika.yandex.ru/stat/traffic/summary.json?id='.self::COUNTER_ID,
    				['Authorization: OAuth '.$token]
    			);
    		}
    	}
    
    	public static function auth(){
    		if (!isset($_GET["code"])) {
    
    			//здесь проверим токен в базе, иначе будем отсылать на получение кода
    
    			Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".self::CLIENT_ID);
    			die();
    		}
    
    		//делаем запрос для получения токена
    		$result = self::postKeys("https://oauth.yandex.ru/token",
    			[
    				'grant_type'=> 'authorization_code',
    				'code'=> $_GET["code"],
    				'client_id'=>self::CLIENT_ID,
    				'client_secret'=>self::CLIENT_SECRET
    			],
    			['Content-type: application/x-www-form-urlencoded']
    		);
    		
    		if ($result["code"]==200){
    			$result["response"]=json_decode($result["response"],true);
    			if(isset($result["response"]["access_token"]))
    				return $result["response"]["access_token"];
    			else
    				return false;
    		}else{
    			return false;
    		}
    
    	}
    
    	public static function postKeys($url,$peremen,$headers) {
    		$post_arr=array();
    		foreach ($peremen as $key=>$value) {
    			$post_arr[]=$key."=".$value;
    		}
    		$data=implode('&',$post_arr);
    
    		$handle=curl_init();
    		curl_setopt($handle, CURLOPT_URL, $url);
    		curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
    		curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
    		curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
    		curl_setopt($handle, CURLOPT_POST, true);
    		curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
    		curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
    		$response=curl_exec($handle);
    		$code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
    		return ["code"=>$code,"response"=>$response];
    	}
    
    	public static function getData($url,$headers) {
    		$handle=curl_init();
    		curl_setopt($handle, CURLOPT_URL, $url);
    		curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
    		curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
    		curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
    		curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
    		$response=curl_exec($handle);
    		$code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
    		return json_decode($response,true);
    	}
    }
    $stat = yandex::getStat();
    Ответ написан
    Комментировать
  • Какое приложение сделать?

    @KaktusTeam
    MoneyApp ведение личного бюджета на Android
    Можно сделать клиента для социальной сети. Лучше даже только мессенджер например к вконтакте или facebook. API у них достаточно хорошо документирован. Сложность будет не детская ну и столкнетесь с всякими задачами на которых можно будет набить руку. Часть данных кэшировать чтоб в оффлайне клиент не просто падал с ошибкой тут и сериализация появляется.
    Удачи!
    Ответ написан
    1 комментарий
  • Какова роль интерфейсов в ООП?

    Приведу пример на коленке. Хотим, например, написать абстрактную файловую систему. Для начала, определим интерфейс, для ФС:

    interface FileSystemInterface {
      public function write($file, $data);
      public function read($file);
    }


    Затем, хочу реализацию интерфейса ФС для работы с файликами:

    class OSFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем файлик, пишем данные
      }
    
      public function read($file) {
        // открываем файлик, возвращаем данные
      }
    }


    Вдруг, кому-то захотелось файловую систему в облаке. Окей, не проблема, реализуем это:
    class CloudFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем соединение с облаком, пишем данные
      }
    
      public function read($file) {
        // открываем соединение с облаком, возвращаем данные
      }
    }

    Пусть у нас есть кой-то код, работающий с файловой системой, назовем его "Хранилище файлов". Пусть он выглядит примерно так:

    class FileStorage {
      protected $Fs;
      
      public function __construct(FileSystemInterface $Fs) {
        $this->Fs = $Fs;
      }  
    
      public function saveFile() {
        $this->Fs->write('file.txt', 'file data');
      }
    
      public function getFile() {
        return $this->Fs->read('file.txt', 'file data');
      }
    }


    Отлично! Теперь мы можем хранилищу файлов отдать любой объект с реализованным интерфейсом FileSystemInterface. Пример:

    // Хранилище файлов работает с файловой системой ОС:
    $FS = new OSFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();
    
    // Хранилище файлов работает с файловой системой в облаке:
    $FS = new CloudFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();


    Использование интерфейса, в данном случае. позволяет нам писать только реализацию работы файловой системы, а бизнес-логика, работающая с файловой системой никак не меняется, она знает, что в любом случае файловая система реализует интерфейс FileSystemInterface и может без опаски использовать методы этого интерфейса.
    Ответ написан
    14 комментариев