• Как правильно писать тесты PHPUnit под ООП?

    Вам не надо тестировать приватные методы.
    Но как же тогда быть, вы скажете?
    Публичные методы используют эти приватные методы, так и проходит тестирование.
    Из этого вытекает, что класс должен быть небольшим и выполнять только одну задачу. Поэтому его приватные методы будут всегда задействованы при тестировании публичных.
    Но вы скажете, что у вас там в публичных методах обращения к базе данных и внешним API, как же тут быть?
    А быть тут просто: все зависимости вашего класса должны включаться в качестве аргументов конструктора, и через использование интерфейсов в аргументах. (Dependency Injection)
    Таким образом в тесте все зависимости класса заменяются теми же моками, и вы легко тестируете не просто сферического корня в вакууме (приватный метод), а именно то, что и нужно тестировать: функциональность самого класса, а не его частей, потому что в OOP именно класс является как бы атомом функционала.
    Но... если вам всё же таки очень надо, то можно это сделать при помощи рефлексии:
    Хорошей практикой является использовать всегда protected вместо private.
    Пишете себе такую вот утилиту:
    class PHPUnitUtil
    {
      public static function callMethod($obj, $name, array $args) {
            $class = new \ReflectionClass($obj);
            $method = $class->getMethod($name);
            // $method->setAccessible(true); // если PHP старше 8.1.0
            return $method->invokeArgs($obj, $args);
        }
    }


    И используете ее в тестах
    $returnVal = PHPUnitUtil::callMethod(
                    $this->object,
                    '_nameOfProtectedMethod', 
                    array($arg1, $arg2)
                 );


    Есть ещё вариант.
    // Оригинальный класс
    class Foo {
      protected function stuff() {
        // secret stuff, you want to test
      }
    }
    
    // Класс для тестов
    class SubFoo extends Foo {
      public function exposedStuff() {
        return $this->stuff();
      }
    }
    Ответ написан
    3 комментария
  • Как сделать разные подвалы (футеры) для разных страниц?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Открыть в редакторе главную страницу, поставить курсор после слова footer, дописать -home и сохранить страницу?
    Ответ написан
    8 комментариев
  • Как перевести изображения на разные языки?

    2ord
    @2ord
    Сделать экспорт в SVG (Tools > Scripts > Batch Export)
    и автоматизировать перевод скриптом: SVG - это XML, для которого есть парсеры на различных языках программирования.
    Так, извлекая текст, можно при помощи API для онлайн машинного перевода перевести на разные языки, используя SDK. Есть нюансы: длина слов может вызвать перевод на другую строку или выход за границы изображения. Это, возможно, тоже решается.
    Ответ написан
    9 комментариев
  • Не приходят письма на почту, что делать?

    @Siverius
    Смех, улыбки, объятия и признания!
    Этого не изведать ей.
    Одинокая открывающая фигурная скобка...
    Ответ написан
    Комментировать
  • Как запомнить действия пользователя на сайте?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    Нужно использовать сессии/cookie.
    Я бы посоветовал, перед тем как что-то писать, дочитать базовое руководство по PHP.
    Ответ написан
    Комментировать
  • Как пронумеровать массив?

    Lopar
    @Lopar
    системный администратор
    Я нихрена не понял, поэтому отвечаю как понял.

    $array = [1, -20, 'tango', 'whiskey',];
    /* echo $array[0]; // 1
     * echo $array[1]; // -20
     * echo $array[2]; // tango
     * echo $array[3]; // whiskey
    */
    
    $array = ['foo' => 'bar', 'baz' => 27,]
    /* echo $array[0]; // bar
     * echo $array[1]; // 27
     * echo $array['foo']; // bar
     * echo $array['baz']; // 27
    */


    Ты это имел в виду, автор?
    Ответ написан
    Комментировать
  • Почему возникает ошибка Internal Server Error при загрузке файла pdf на сайт?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    5zf667.jpg

    Обычно ошибки пишутся в лог ошибок веб-сервера, если в настройках РНР не указано иное
    Ответ написан
    2 комментария
  • Как сделать такое на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Считать сумму всех значений, увеличивать радиус пропорционально:
    Ответ написан
    Комментировать
  • Как сделать чередование постов из разных циклов(условий/такс)?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Проще всего заказать из базы конкретные ids в определенном вами порядке, иначе вы вряд ли сможете гарантировать, что записи разных типов придут вам в нужном порядке

    $args = [
    	'post_type' => ['post','service'],
    	'post__in' => [5,12,2,14,7],
    	'orderby' => 'post__in',
    ];
    
    $loop = new WP_Query( $args );


    При выводе проверяете тип записи и подключаете нужный шаблон

    if ( get_post_type() === 'service' ) {
    	get_template_part( 'templates/archive/archive-service' );
    } else {
    	get_template_part( 'templates/archive/archive-common' );
    }


    Если типов записей много, то можно сделать так

    $post_type = get_post_type();
    
    if ( file_exists( get_theme_file_path( 'templates/archive/archive-' . $post_type . '.php' ) ) ) {
    	get_template_part( 'templates/archive/archive-' . $post_type );
    } else {
    	get_template_part( 'templates/archive/archive-common' );
    }
    Ответ написан
    Комментировать
  • Как понять хорош ли код?

    @alexalexes
    Для анализа производительности необходимо в вашем скрипте поставить контрольные точки, в которых будут логироваться текущее действие. Так можно понять, на что обратить внимание.
    Например, можно составить такой лог:
    0 мс: начало скрипта
    12 мс: начало чтения файла
    24 мс: конец чтения файла
    30 мс: запрос единицы товара
    34 мс: обновление цены единицы товара
    35 мс: запрос единицы товара
    36 мс: обновление цены единицы товара
     ....
    12345 мс: конец скрипта.

    PS: Логировать можно не только время, но и используемую память, и другие интересуемые параметры в момент фиксации точки.
    Ответ написан
    3 комментария
  • Как правильно верстаются фотографии в карточке товара?

    godsplan
    @godsplan
    При клике на маленькую фотку брать ее src и подставлять в большую фотку. А открытие через какой нибудь фансибокс или ручками
    Ответ написан
    Комментировать
  • В чем практический смысл использования интерфейсов в PHP?

    gscraft
    @gscraft
    Программист, философ
    Вам нужно смотреть в сторону принципов SOLID, разобраться, почему эти подходы оправданы. Интерфейсы же выполняют несколько задач, в связи с этими принципами.

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

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

    В-третьих, продуманный интерфейс позволяет в большей степени создавать взаимозаменяемые реализации — конечные классы. Тот, кто использует интерфейс при разработке класса обязан разработать все обязательства интерфейса.

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

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

    Добавлю, к слову, о внедрении зависимостей. Действительно, этот подход может использоваться и без интерфейсов, тот факт, что инверсия управления и внедрение зависимостей используются чаще всего с интерфейсами — своего рода совпадение. Хороший пример: фреймворк Yii 2 или библиотека Pimple, там в качестве маркеров для внедрения зависимостей часто используются произвольные (или основанные на иных соглашениях) строки. Это к тому, что DI — необязательно самый яркий пример использования интерфейсов (хотя и более ценный, чем другие варианты).
    Ответ написан
    Комментировать
  • Как правильно ввести дату?

    @Azperin
    Дилетант
    Ну самое первое что пришло в голову:
    date = dataObj.pickup_date.toString().split('/').reverse().join('-');
    Ответ написан
    3 комментария
  • Чем PHPMailer отличается от обычной mail() функций??

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Функция mail() в PHP по сути вызывает встроенную в систему почтовую программу - стандартно, это sendmail в linux (также, возможно использовать qmail, postfix, но для этого надо сначала сконфигурировать PHP через .ini файл).
    Подробнее про Mail в PHP: https://www.php.net/manual/ru/book.mail.php
    И про основную проблему кроссплатформенного использования: https://habr.com/ru/post/26518/

    PHPMailer - это мощная библиотека, реализующая почтовые транспорты, а не использующая sendmail как стандартная mail() функция. Имеет из коробки большое количество возможностей, таких как (в списке представлена лишь малая часть):
    • полная поддержка SMTP, Qmail, POP3, IDN, DKIM;
    • поддержка SSL и TLS;
    • работает на любой win32 и *nix платформе;
    • гибкость отладки;
    • определяемые вручную заголовки писем;
    • совмещение нескольких сообщений и вложений;
    • встроенная поддержка изображений;
    • умеет посылать письма с множественными: адресатами (TO), копиями (CC), BCC и REPLY-TO;
    • многослойные/альтернативные сообщения для клиентов, которые не могут читать HTML письма;
    • поддержка 8 бит, base64, бинарного режима, и пригодного для печати формата;
    • перенос слов (word wrap);
    • сообщения в виде HTML (шаблоны);
    • библиотека проверена на множестве SMTP серверах: Sendmail, qmail, Postfix, Imail, Exchange, Mercury, Courier;
    • библиотека используется под капотом таких гигантов: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla;

    Подробнее можно прочитать тут:
    https://jino.ru/journal/articles/pochta-phpmailer/
    https://www.sesmikcms.ru/pages/read/ischerpyvajusc...

    Помимо PHPMailer существуют и другие крутые библиотеки, оставляю список для интересующихся:
    Swiftmailer
    (Symfony) Mailer

    Если вы активно пользуетесь функцией mail() при разработке на PHP и до сих пор ещё не сталкивались с проблемами при её использовании на хостингах или на своих собственных серверах без соответствующего правильно настроенного окружения, то mail() вам идеально подходит. А когда столкнётесь с проблемами или захотите иметь больше возможностей из коробки, станут очевидными плюсы PHPMailer и других специализированных библиотек.
    Ответ написан
    1 комментарий
  • Как подключить flexbox?

    vmakhnyuk
    @vmakhnyuk
    Frontend developer
    Вам стоит поправить верстку:
    <div class="advantages_item">
          <img src="img/Услуги.jpg" alt="" />
          <h2>У нас вы можете:</h2>
          <p>Lorem ipsum dolor sit amet.</p>
        </div>
        <div class="advantages_item">
          <img src="img/Услуги.jpg" alt="" />
          <h2>У нас вы можете:</h2>
          <p>Lorem ipsum dolor sit amet.</p>
        </div>
        <div class="advantages_item">
          <img src="img/Услуги.jpg" alt="" />
          <h2>У нас вы можете:</h2>
          <p>Lorem ipsum dolor sit amet.</p>
        </div>
    Ответ написан
    1 комментарий
  • Как сверстать такой блок?

    solidcreature
    @solidcreature
    Развиваю сообщество WordPress в Москве
    не универсальный способ, но может сработать:
    1) Для секции внутри которой находится container задайте фон, который наполовину синий, наполовину белый.
    2) Внутри контейнера задайте синий и белый фон для соответствующих колонок

    В итоге фон от колонок будет перекрывать фон секции внутри контейнера, а по краям будут правильные цвета
    Ответ написан
    1 комментарий
  • Как автоматически заполнить значение поля при создании поста в Wordpress?

    foxayb
    @foxayb Автор вопроса
    newbie
    Решение нашел.
    function save_Video_Post() {
    	global $post; 
    if( has_post_format( 'video' ) ) {
    		
    	$KEKSik = get_post_meta( $post->ID, 'wpvr_video_service_url', true );
    	                 update_post_meta( $post->ID, 'video_url', $KEKSik );	
    
    										
    	}
    }
    
    add_action( 'acf/save_post', 'save_Video_Post');
    Ответ написан
    Комментировать
  • Почему форма входа работает некорректно?

    А где у вас обработчик на php и js код?
    Я у себя юзаю вот этот код, только конечно закостомил
    https://gist.github.com/cristianstan/10273612
    Ответ написан
    1 комментарий
  • Чем отличается функция от генератора?

    @sl0
    Ответ написан
    Комментировать
  • Как создать плагин или функционал из готовых данных в wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Не понял о какой карусели идет речь...
    Вам нужен ACF repeater (повторитель), чтобы динамически добавлять поля
    Если вам нужно динамически добавлять только картинки (слайдер), то можете использовать acf gallery (галерея).
    Что касается скрипта самой карусели, то берите готовые js библиотеки
    https://owlcarousel2.github.io/OwlCarousel2/
    https://kenwheeler.github.io/slick/
    и другие
    Ответ написан
    4 комментария