• Как можно решить проблему с доступам к методам PHP классов унаследованным от одного класса?

    alestro
    @alestro
    Как вариант можно сбрасывать скоп внутри метода $api->dependency

    class Node
    {
        protected function func1() {
        }
    }
    class NodeA extends Node
    {
        public function FUNC2() {}
    }
    class NodeB extends Node
    {
        // Функция инициализации
        public function __construct()
        {
            (new Api())->dependency(
                function (?NodeA $a) {
                    $a->FUNC2(); // Метод успешно вызывется так как он public
                    $a->func1();  // Call to protected method Node::func1() from global scope
                }
            );
        }
    }
    
    class Api {
        function dependency(callable $dependency) {
            if ($dependency instanceof Closure) {
                $dependency = Closure::bind($dependency, null, null);
                $dependency(new NodeA());
            }
        }
    }


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

    class Node
    {
        private array $whiteList = [
            NodeA::class
        ];
    
        protected function func1() {
            $scope = debug_backtrace(2, limit: 2)[1]['class'];
            if (!in_array($scope, $this->whiteList)) {
                throw new Exception('Нельзя вызвать метод для данного класса '. $scope);
            }
        }
    }
    class NodeA extends Node
    {
        public function FUNC2() {}
    }
    class NodeB extends Node
    {
        // Функция инициализации
        public function __construct()
        {
            (function (?NodeA $a) {
                $a->FUNC2(); // Метод успешно вызывется так как он public
                $a->func1();  // Нельзя вызвать метод для данного класса NodeB
            })(new NodeA());
        }
    }
    Ответ написан
    1 комментарий
  • Как сделать такой input type range?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Ответ написан
    Комментировать
  • Насколько актуальна книга Марка Саммерфильда?

    @calculator212
    в 2013 на английском и только в 2016 году на русском, а это почти 10 лет назад,
    Глобальных измений за 10 лет было не так много, упражнения в этой книге в целом довольно интересные (если затык с ними то можно на гите поискать решения), поэтому в целом книга достаточно актуальная.
    Ответ написан
    Комментировать
  • GitHub, GitLab или BitBucket?

    vabka
    @vabka
    Токсичный шарпист
    Gitlab на собственном сервере.
    1. Предсказуемая цена. Никто тебе неожиданно тариф не повысит
    2. Защищается от попадания под санкции (для России очень актуально)
    3. Никто не удалит твой проект без объяснения причин.

    Не битбакет, тк битбакет - мусор.
    Гитхаб я бы использовал только как зеркало, если делаешь опенсорс.
    Ответ написан
    Комментировать
  • Какие требования к VPS/VDS для PHP-фреймворков?

    @Everything_is_bad
    вся прелесть vps - берешь минимальный тариф, когда начинает не хватать, апаешь на следующий из линейки тарифов
    Ответ написан
    3 комментария
  • Как правильно распарсить json?

    @12rbah
    В правый столбик тут нужно кинуть JSON а в левом будет сгенерирована нужная структура, которую можно будет использовать для маршалинга/анмаршалинга
    Ответ написан
    Комментировать
  • Как на jQuery удалить динамически созданный класс по таймеру?

    Get-Web
    @Get-Web Куратор тега JavaScript
    Front-End Developer
    У function свой this, поэтому передаем либо переменную, которая ссылается на нужный элемент:
    $(".js-answer").click(function() {
        let __this =  $(this);
        __this.addClass("current");
        setTimeout(function() {
            __this.removeClass("current");
        }, 1400);
    });

    Либо используем стрелочную функцию, которая не имеет своего this
    $(".js-answer").click(function() {
        $(this).addClass("current");
        setTimeout(() => {
            $(this).removeClass("current");
        }, 1400);
    });
    Ответ написан
    Комментировать
  • Странное поведение str_replace() при заменах в HTML?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Работать регулярками с HTML можно, но сложно.
    Проще использовать библиотеку, предназначенную для этого, например Simple HTML DOM Parser.
    Ответ написан
  • Можно ли уникализировать отправку форм с сайта без cms?

    karabanov
    @karabanov
    Системный администратор
    Можно в форму добавить скрытое поле идентифицирующее форму, а в скрипт отправки проверку наличия этого поля и на основе его содержимого добавление в письмо информации о том какой формой оно было отправлено.
    Ответ написан
    Комментировать
  • Как написать стили для блоков, что прилипают к разным сторонам контейнера?

    Aetae
    @Aetae
    Тлен
    У flex есть свойство order.
    Просто сделай что-то типа:
    block:nth-child(odd) block__element {
      order: 2
    }

    И оно само выстроится с периодичностью.
    Ответ написан
    Комментировать
  • Что стоит использовать для защиты PHP-кода на текущий момент?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сообщество считает, что всё это бессмысленные ужимки, которые в 99% случаев используются только для того, чтобы прикрыть крайнее убожество кода. Серьёзные продукты никто не шифрует. Чем, в частности, объясняется заброшенность всех этих, на первый взгляд многочисленных, проектов, которые не выходят из стадии "мы тут с одноклассниками придумали крутую штуку". потом одноклассники либо умнеют и перестают теребить ерунду, либо находят занятие более интересное, чем пхпе.

    Сам по себе код мёртв. Он устарел ещё до релиза. В работе софта важна не дискетка с исходниками, а поддержка. Вот поддержку и надо продавать. И не дрожать над каждым вором. Потому что защита от одного вора отпугивает 10 честных покупателей.

    Плюс всегда есть SAAS.
    Ответ написан
    4 комментария
  • Как правильно задать запрос UPDATE где название столбца переменная?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Этот вопрос - прекрасная иллюстрация того факта, что нормализация базы данных - это не блажь оторванных от жизни теоретиков, а насущная необходимость. И её отсутствие приводит к проблемам на ровном месте.

    Уже по наличию нумерованных столбцов сразу видно, что структура БД кривая. А текущая проблема делает это еще более наглядным: собственно, сама постановка вопроса, "как задать имя столбца через переменную", говорит о том, что имя колонки используется в условии. То есть оно должно быть значением в строке.

    Здесь нужна связанная таблица, один ко многим, и она сразу снимет все проблемы, а запросы станут мягкими и шелковистыми:

    UPDATE link_count SET count=count+? WHERE link_id=? and number=?
    Ответ написан
    3 комментария
  • Как правильно задать запрос UPDATE где название столбца переменная?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Как насчет оператора CASE?

    $sql = "UPDATE `list` 
            SET count1 = CASE WHEN id = ? AND ? = 1 THEN count1 - ? ELSE count1 END,
                count2 = CASE WHEN id = ? AND ? = 2 THEN count2 - ? ELSE count2 END,
                count3 = CASE WHEN id = ? AND ? = 3 THEN count3 - ? ELSE count3 END
            WHERE id = ?";
    
    $stmt = $conn->prepare($sql);
    
    foreach ($data as $id => $value) {
        $idParts = explode("-", $id);
        $count = $value['count'];
        $stmt->execute([$idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0]]);
    }


    Здесь используется оператор CASE для обновления нужного столбца в зависимости от значения $idParts[1]. Если $idParts[1] не соответствует ни одному из условий, то значение столбца остается неизменным. Ну и не забываем про подготовленный запрос prepare чтобы избежать возможной инъекции
    Ответ написан
    7 комментариев
  • Как сделать что бы border не растягивался на всю страницу а только шёл до последней буквы?

    Aetae
    @Aetae
    Тлен
    display: inline-block;?
    Ответ написан
    Комментировать
  • Элементы расположены по кругу, кол-во элементов опционально, они должны крутится во круг центра. Как сделать анимацию?

    Alexandroppolus
    @Alexandroppolus
    кодир
    https://codesandbox.io/p/sandbox/rotated-ffjlsh

    набросок. Вроде бы синий квадрат синхронизируется с парентом и не меняет своего разворота. Скорость вращения та же
    Ответ написан
    2 комментария
  • Как реогранизовать процесс разработки в IT-продукте?

    saboteur_kiev
    @saboteur_kiev Куратор тега Веб-разработка
    software engineer
    Первый вариант - если есть прибыль, нанять людей, чтобы написать все с нуля, но уже масштабирование сразу предусмотреть в архитектуре. Зависит от сложности проекта, конечно.

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

    Разделить разработку и поддержку.

    Разработка - на тестовом енвайрнменте с тестовыми данными
    Поддержка - ограниченным кругом доверенных специалистов.
    Ответ написан
    Комментировать
  • Как числа из строки поместить в массив?

    kawabanga
    @kawabanga
    $arr = explode(',', $str);
    foreach ($arr as $value) {
        $new_arr[] = trim($value);
    }


    Зачем использовать регулярки, если они не нужны в задаче.
    А если нужны по заданию, то
    Ответ написан
    3 комментария
  • Какой фреймворк для Go изучать в 2024 году?

    @dcaraxes
    meme engineer
    По большей части фреймворки не нужны, для удобства можно использовать сторонние роутеры, которые работают поверх net/http. Например, go-chi, gorilla/mux (его снова начали поддерживать). Можете попробовать Go 1.22 - там как раз нововведения касательно роутера в стандартном пакете, и не придется тянуть сторонние зависимости.
    Ответ написан
    Комментировать
  • Какую CMS выбрать для первого учебного проекта?

    @Asokr
    Берите, ставьте WP. Куча плагинов, ни какой платной подписки для подключения плагинов не требуется...
    Плагин может быть платным, или иметь дополнительный функционал за оплату.
    Но, для ваших целей 100% есть бесплатные...

    А вот Битрикс изначально коммерческая, платная CMS...
    Ответ написан
    5 комментариев