• Как считать ответ POST частями?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Вы можете воспользоваться Guzzle и middleware MultipartStream
    https://github.com/guzzle/psr7#multipartstream

    Как работать со стримами:
    https://docs.guzzlephp.org/en/stable/psr7.html?hig...
    Ответ написан
    Комментировать
  • Как провести соответствие между строкой и классом с точки зрения SOLID?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это всё очень плохо.
    В первом варианте человек должен знать, как мяукают кошки, а в последнем "правильном" варианте человек трогает не кошку, а кошачий голос(?!).
    В "идеальном" варианте опять же выбирается не животное, которое надо погладить, а его голос.

    Чтобы следовать принципам солид, надо понять в первую очередь ЗАЧЕМ это всё делается.
    А делается это для того чтобы уменьшить связность. Чтобы класс, использующий какой-либо функционал, не знал деталей его реализации. И, соответственно, мы могли бы менять реализацию без опасения поломать что-то в классе-пользователе.

    При этом extends, кроме как от абстрактного класса, эту связность всегда увеличивает.
    И его надо избегать. А использовать принцип Composition over inheritance. То есть нужный функционал получать не наследованием, а передачей независимых функциональных модулей в виде параметров.

    Соответственно, нам надо сделать иерархию: голос - животное - потрогать.
    И вот теперь у нас хоть голос, хоть животное, будут открыты для каких угодно изменений, до тех пор пока они поддерживают публичный контракт.
    / ******* голоса *******/
    abstract class VoiceEngine {
    	public function getVoice() {}
    }
    class CatVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Meow!";
    	}
    }
    class DogVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Bark!";
    	}
    }
    class HumanVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Да пошёл ты!";
    	}
    }
    / ******* животные *******/
    abstract class Animal {
    	public function __construct(public VoiceEngine $voiceEngine) {}
    	public function say() {
    		echo $this->voiceEngine->getVoice();
    	}
    }
    class Cat extends Animal{}
    class Dog extends Animal{}
    class Human extends Animal{
    	public function touchAnimal(Animal $animal) {
    		$animal->say();
    	}
    }
    / ******* исполнение *******/
    $cat = new Cat(new CatVoiceEngine());
    $dog = new Dog(new DogVoiceEngine());
    $human = new Human(new HumanVoiceEngine());
    $human->touchAnimal($cat);
    $human->touchAnimal($dog);
    $human->touchAnimal($human);


    После того как я, раздуваясь от гордости, написал этот ответ, до меня вдруг дошло что на вопрос-то я так и не ответил.
    Соответственно, задачу выбора животного возлагаем на отдельную сущность:

    class AnimalFactory {
        public static function create($type) {
            return match($type) {
                'cat' => new Cat(new CatVoiceEngine()),
                'dog' => new Dog(new DogVoiceEngine()),
                'human' => new Human(new HumanVoiceEngine()),
            };
        }
    }
    $human = new Human(new HumanVoiceEngine());
    $human->touchAnimal(AnimalFactory::create('cat'));

    В итоге мы вернулись к тому же кейсу (match - это улучшенный case), но при этом у нас всё разделено, и каждый класс занимается строго своим делом.
    Ответ написан
  • Как провести соответствие между строкой и классом с точки зрения SOLID?

    @Akela_wolf
    Extreme Programmer
    Если уж совсем идеально, то:
    interface Voice {
      void say();
    }
    
    class Dog implements Voice { ... }
    class Cat implements Voice { ... }
    
    interface VoiceFactory {
      Voice getVoice(String voiceType);
    }
    
    class VoiceFactoryImpl implements VoiceFactory {
      private Map<String, Supplier<Voice>> suppliers = new HasMap<>();
      
      void addSupplier(String type, Supplier<Voice> supplier) { suppliers.put(type, supplier); }
    
      @Override
      Voice getVoice(String type) {
        final Supplier<Voice> supplier = suppliers.get(type);
        if (supplier != null) {
          return supplier.get();
        } else {
          throw new RuntimeException("No supplier for type: "+type);
        }
      }
    }


    Класс VoiceFactoryImpl выполняет принцип OCP - открыт для дополнений через метод addSupplier, в него можно добавлять новые сопоставления строка - животное и закрыт для изменений.
    Ответ написан
    9 комментариев
  • Почему при ajax подгрузке посты получаются в виде Html?

    @Kostik_1993
    Web Developer
    Надим Закиров написал ответ, но он не совсем верный, только отчасти
    На самом деле так часто делают на сайтах при серверном рендеринге страниц написанных например на PHP. Генерация в браузере подходит для изоморфных сайтов или SPA, но не для них, так как сайт может быть зависим от SEO, а делать два разных движка для отрисовки и на сервере и на клиенте не могут по техническим или идейным соображениям
    Ответ написан
    2 комментария
  • Почему при ajax подгрузке посты получаются в виде Html?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Считается, что так меньше нагрузка на браузер, мол не надо генерировать html-дерево на основе полученных данных, а просто берешь и сразу вставляешь на страницу готовый html-код который прислал сервер. Меньше нагрузка - быстрее отображаться данные, меньше лагов при прокрутке и так далее.
    Ответ написан
    Комментировать
  • Какой стек технологий выбрать для высоконагруженного MVP?

    @caballero
    Программист
    если еще ничего нет с чего вы решили что оно будет высоконашгруженым? тем более если это тольок MVP

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

    впрочем тому кто задает вопросы на чем писать еще лет пять опыта мигимум для того чтобы писать проекты для высокой нагрузки
    Ответ написан
    2 комментария
  • Как вставить кавычку корректно?

    @dero
    о себе
    Заменить кавычку на &#39;
    Ответ написан
    Комментировать
  • Как вставить кавычку корректно?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    <?= $name ?> вообще никогда нельзя писать
    а всегда только <?= htmlspecialchars($name, ENT_QUOTES) ?>
    Ответ написан
    Комментировать
  • Почему Thread работает так?

    Это не тред виноват, а замыкания.
    Когда ты ссылаешься в лямбде на переменную - к ней обращение происходит по ссылке.
    Вот и получилось, что на момент запуска значение i уже 2.
    Решить эту проблему можно, если скопировать значение i в новую переменную вот так:
    for (int i = 0; i < 2; i++)
    {
        var i2 = i;
        Thread thread = new Thread(() =>
        {
            Console.WriteLine("main index: " + i2);
        });
        thread.Start();
    }
    Ответ написан
    Комментировать
  • Что происходит под капотом, когда я вызываю MyEvent?.Invoke, MyEvent.BeginInvoke?

    Мне кажется, вот этот ответ достаточно хорош:
    https://stackoverflow.com/questions/1916095/how-do...
    Тоесть да. Будет взят поток из thread pool, но не забывай вызывать EndInvoke, иначе поток не вернётся в пул.

    А вообще лучше вместо event-ов использовать Rx: https://github.com/dotnet/reactive
    Если это делается в UI, то есть ещё надстройка поверх него: https://github.com/reactiveui/ReactiveUI
    Ответ написан
    Комментировать
  • Нужно ли проверять длину значений, приходящих от пользователя?

    @alexalexes
    Всегда полезно проверять мин. макс. параметры всех значений и кидать исключение в случае чего.
    А вообще, есть кейсы, где лучше поругаться на слишком большую длину сообщения.
    Например, когда будете сохранять это сообщение в СУБД MySQL в поле типа данных varchar(10000) с превышением длины, то СУБД в случае превышения длины строки по тихому сохранит первые 10000 символов, а переполненную часть - нет. Так что лучше проверить длину сообщения, и если она не соответствует регламентированной, то не давать зеленый свет для обработки.
    Ответ написан
    Комментировать
  • Как проверить оставил ли конкретный пользователь комментарий в виджете на сайте?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    только через https://vk.com/dev/widgets.getComments
    Используй https://vk.com/dev/execute и сможешь вызывать 25 раз метод в одном запросе
    Ответ написан
    1 комментарий
  • Visual studio, как поменять зависимость зависимости?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    возможно поможет перенаправление
    https://docs.microsoft.com/ru-ru/dotnet/framework/...
    Другой вариант собрать этот пакет самому и в дальнейшем поддерживать
    Ответ написан
    Комментировать
  • Как выделить символы одной регуляркой?

    @galaxy
    U+0008

    так обычно обозначаются Unicode codepoints. Без задания кодировки это обозначение физического воплощения не имеет, вообще говоря (а строки в PHP ничего не знают о кодировках). Так что для начала разберитесь, в какой кодировке у вас исходная строка.
    В строке из примера кодировка UTF8, указанные символы просто из нижнего непечатного диапазона, их можно выделить так: [\x00-\x19]+
    Ответ написан
    Комментировать
  • PHP Как убрать задержку не отключая Сесcии?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Для общего понимания проблемы рекомендую почитать Блокирование сессий в PHP

    Возможные решения:
    1. session_write_close();
    2. не использовать сессии где они не нужны
    3. использовать драйвер сессий без блокировки
    Ответ написан
    Комментировать
  • Почему число не равно себе?

    DevMan
    @DevMan
    потому что с флоатами работают иначе.
    https://3v4l.org/ruM0e
    Ответ написан
    Комментировать
  • Почему число не равно себе?

    Комментировать
  • Почему число не равно себе?

    vaut
    @vaut
    Потому что нельзя сравнивать на равенства числа с плавающей запятой.
    Числа с плавающей точкой представляются в двоичном виде только с конечным количеством разрядов для мантиссы и порядка. При превышении этого количества происходит переполнение. В результате иногда PHP (а также другие языки) не считают два числа действительно равными, так как они могут отличаться в самом последнем разряде.

    Для того чтобы обойти эту трудность, вместо проверки равенства $a == $b следует обеспечить очень небольшую разность ($delta) между первым и вторым числом. Размер этой дельты должен быть меньше разницы между двумя числами, которую вы хотите обеспечить. Затем для получения абсолютного значения разности вызывается функция abs().
    Ответ написан
    1 комментарий
  • Почему число не равно себе?

    sswwssww
    @sswwssww
    Попробуй округлить tmp2 до двух знаков после запятой, они станут равны.
    Ответ написан
    Комментировать
  • Как работает режим чтения в бразерах?

    wapster92
    @wapster92
    Используя верную разметку браузеры сами подбирают, что им показывать в режиме для чтения. А вот статья для более детального углубления в это дело.
    Ответ написан
    Комментировать