• Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    0xD34F
    @0xD34F
    function f(&$x) {
      $x = 666;
    }
    
    f($xxx);
    
    echo $xxx; // 666
    Ответ написан
    Комментировать
  • Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Точно так же и делается

    function test(&$param)
    {
        $param = 123;
    }
    
    test($parameter);
    
    echo $parameter;
    Ответ написан
    Комментировать
  • Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    Melkij
    @Melkij
    PostgreSQL DBA
    function foo(&$out) 
    {
    	$out = 'hello!';
    }
    
    foo($hello);
    var_dump($hello);
    Ответ написан
    Комментировать
  • Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    neuotq
    @neuotq
    Прокрастинация
    Вас проверяли на знание того, как передаются переменные в функция в php. Переменные передаются всегда по значению, те передаёте переменную в функцию, туда копируется в новую переменную значение оригинальной.

    С помощью амперсанда & мы можем заставить передавать ссылку на эту же переменную в памяти. И тогда манипуляции с ней внутри функции будут равны манипуляциям вне.

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

    А вот есть если передать её по ссылке, те с амперсандом, то внутри функции будет переменная со ссылкой на переменную вне, и поэтому не только манипуляции с объектом, но и перетирание переменной в целом повлияет.

    class A {
        public $foo = 1;
    }
    
    //создали переменную
    //в ней хранится id объекта, сам объект где-то в памяти оптимизированно лежит
    $newObj = new A;
    
    //Вывод 1
    echo $newObj->foo;
    
    function foo($obj) {
    	//в obj скопирован id объекта
    	//тк он тот же, то меняется и оригинальный объект
    	$obj->foo = 2;
    	//локальная переменная перетёрся, больше id объекта не хранит
    	//на внешнюю не повлияло
    	$obj = null;
    	
    }
    
    foo($newObj);
    // получили 2
    echo $newObj->foo;
    
    
    function bar(&$obj) {
    	//obj ссылается на тоже место в памяти, что и внешняя переменная с id объета
    	//тк он тот же, то меняется и оригинальный объект (тут логично, тк по ссылке)
    	$obj->foo = 2;
    	//локальная переменная перетёрся, больше id объекта не хранит
    	//внешняя тоже перетрётся
    	$obj = null;
    }
    
    
    bar($newObj);
    //ошибка предупреждение, нельзя читать свойства на null
    echo $newObj->foo;


    Ну и зная всё это, вы можете написать свою простую функцию, по типа прегматча.
    function mySum($a, $b, &$result) {
    	$result = $a + $b;
    }
    //первые два параметра по значению, в третий передаём переменную
    //она тут же инициализируется (как если бы её до этого написать просто $res;)
    // и передаётся её ссылка внутрь функции
    mySum(1,2, $res);
    
    //3
    echo $res;
    Ответ написан
    Комментировать
  • Как вытащить видео с сайта?

    @timursarsembayev
    ОТВЕТ 2020 ГОДА

    Привет, из 2020 :)

    Решение для Linux (у меня Linux Mint):
    1. Откройте страницу с видео роликом, видео не включайте
    2. Открываете инспектор, вкладку Network
    3. Включаете воспроизведение видео
    4. В инспекторе в строке поиска вбиваете m3u8 и находите данный файл плейлиста (он обычно только один)
    5. Скачиваете плейлист файл с расширением m3u8
    6. Отдельно сохраните ссылку на m3u8, она будет примерно такой:
    https://cs9-4v4.vkuservideo.net/video/hls/p2/3ebb0cd8afd8/index-f3-v1-a1.m3u8?extra=hkhc5u2Cz0VxVRI1gf8Zw_p-K1zG5eCCK_-AKvw8v0tBNO4CmLZSO8j5PKdHBSebK_Ph_sY7PqEDwFNzHJt-eXnOKPj1QRZD0ahfqy24z6ZIdGKqvRnHuE-PhoocuvBqMpKPAI46LFv4juflt6hO6mO4Elc

    Отсюда нужно вычленить название самого файла и параметры после него, останется только это:
    https://cs9-4v4.vkuservideo.net/video/hls/p2/3ebb0cd8afd8/

    (у вас ссылка будет отличаться, это просто пример)
    7. Откройте скачанный файл m3u8 в редакторе, например, Sublime Text
    8. Откройте поиск по содержимому файла, включите режим регулярных выражений (regular expression), от строки поиска слева это кнопка .* или кликните по строке поиска и нажмите Alt+R
    9. Введите в строку поиска #EXT.* и нажмите на кнопку Найти всё (Find All) и нажмите Backspace
    10. Скопируйте полученный урл из 6 шага
    11. Введите в строку поиска символ ^ (на англ.раскладке клавиатуры нажмите Shift+6) и нажмите Найти всё (Find All)
    12. Вставьте скопированный урл (нажмите Ctrl+V) и сохраните изменения в файле
    13. Откройте uGet (если не установлено, то установите его), перейдите в File -> Batch Downloads -> Text file import и выберите файл плейлиста m3u8, начнется скачивание отдельных файлов формата .ts в вашу домашнюю папку /home/username где username это имя вашей учетной записи
    14. По окончании скачивания снова откройте файл плейлист в редакторе Sublime Text
    15. В строку поиска вставьте скопированный урл из 6 шага и нажмите Найти всё (Find All), нажмите Backspace и сразу же напишите file ' ( слово file, пробел и одинарная кавычка ' )
    16. В строку поиска введите ?extra.* ( если у вас включен режим регулярок, то введите \?extra.* ), нажмите клавишу Backspace, а затем клавишу ' (одинарная кавычка)
    17. В итоге вы получите файл со списком что-то вроде этого:
    file 'seg-1-f3-v1-a1.ts'
    file 'seg-2-f3-v1-a1.ts'
    file 'seg-3-f3-v1-a1.ts'
    и так далее...
    18. Переименуйте файл плейлиста и измените его расширение, например так:
    dwl_local.txt
    19. Переместите файл dwl_local.txt в домашнюю папку /home/username куда были скачаны все файлы .ts
    20. Откройте терминал в домашней папке и введите в нём следующее:
    ffmpeg -f concat -i dwn_local.txt -c copy output.ts
    или скопируйте эту строку и вставьте в терминал путем Shift+Ctrl+V
    где dwn_local.txt это название файла со списком файлов
    output.ts это название конечного файла

    Если по каким-то причинам у вас не установлен ffmpeg, то установите его через терминал:
    sudo apt install ffmpeg

    Решение для Windows:
    Всё то же самое, что и для Linux с 1 по 12 шаги
    13. Нужен Download Master, также импортируйте файл плейлиста со ссылками, возможно нужно будет его переименовать сразу и поменять расширение, например, на dwn_local.txt
    Дальше шаги с 14 по 18 повторите как в инструкции для Linux
    19. Переместите файл dwn_local.txt в папку с загруженными файлами, возможно это папка Downloads (Загрузки)
    20. Откройте командную строку Windows (найдите её в меню Start или Пуск) или нажмите клавиши Win+R и введите cmd, затем клавишу Enter
    В командной строке введите следующее:
    ffmpeg -f concat -i dwn_local.txt -c copy output.ts
    где dwn_local.txt это список файлов
    output.ts это конечный объединенный файл

    Таким образом вы получаете объединенный файл .ts из нескольких фрагментов .ts
    Сконвертировать в другие форматы можно при помощи VLC плеера или других программ
    Файл .ts можно загружать себе на YouTube канал без конвертаций
    Ответ написан
    4 комментария
  • Существует ли в JavaScript, какая-либо возможность получить содержимое метода в виде строки?

    Alexandroppolus
    @Alexandroppolus
    кодир
    в общем случае нет.
    метод может ссылаться на какие-нибудь переменные через замыкание, и строка будет бесполезна
    Ответ написан
    Комментировать
  • Почему не видит 'this' в объекте внутри класса?

    @Yaroslav1734
    Вы объявляете bar в словаре а не в классе, вот решение:

    class foo {
        
        bar = `Привет`;
        o = {
            baz: this.bar + `, Мир!`
        };
    
    }
    Ответ написан
    Комментировать
  • После редактирования wp_query в pre_get_posts выдает 404 страницу?

    cesnokov
    @cesnokov
    <head>&nbsp;</head>
    Вы перезаписываете параметры, а их надо добавлять к уже существующим:
    add_action( 'pre_get_posts', 'action_function_name_11' );
    function action_function_name_11( $query ) {
       if ( isset($_GET['research_me']) && $query->is_main_query() ) {
          $meta = $query->get('meta_query');
          $meta[] = array(
             'key' => 'test123',
             'value' => 'text5',
             'compare' => '='
          );
          $query->set('meta_query', $meta);
       }
    }
    Ответ написан
    Комментировать
  • Как сделать экпорт в кодировке utf8 из большой БД MySQL с помощью mysqldump?

    web_user
    @web_user Автор вопроса
    Django, HTML + CSS, JS, Photoshop, Illustartor
    Вот решение:
    mysqldump -uUSERNAME -p DATABASENAME --single-transaction --default-character-set=utf8 -e -r FILENAME.dump


    Получил все в UTF-8, методом проб и ошибок. Уфф, ура! =)

    --single-transaction – надо добавлять для таблиц InnoDB (с хабра и про -e тоже там написано).

    -r – это правильнее, чем вывод в файл через ">" прочел на англ. ресурсе, но уже не помню где, что-то связано с кодировками.

    Все остальное используем как есть)
    Ответ написан
    Комментировать
  • Название хука, для вставки HTML между двумя контейнерами?

    @desocrew
    var area = document.querySelector(".content-area");
    area.innerHTML = "<html код>" + area.innerHTML
    Ответ написан
    Комментировать
  • Почему JS-функция, останавливает выполнение после первого абзаца?

    @slide13
    frontend/web-developer
    childNodes включает не только элементы, но и тексты, комментарии, переносы строк. После парсинга p элементы находятся внутри текстовых переносов строк /n, поэтому когда производится проверка if ( e.nodeType !== Node.ELEMENT_NODE ) return; они игнорируются. Так что если требуется перебрать только элементы всегда нужно использовать children, а не childNodes. В данном случае все переносы строк буду проигнорированы и элементы p преобразуются как нужно.

    function testFn(node) {
      for (const child of node.children) {
        testFn(child);
        if ( child.nodeName !== 'LI' ) {
          child.replaceWith( ...child.childNodes );
        }
      }
    }
    Ответ написан
    2 комментария
  • Достаточно ли одного Windows Defender в качестве единственного антивируса?

    GavriKos
    @GavriKos
    Да
    Ответ написан
    Комментировать
  • Достаточно ли одного Windows Defender в качестве единственного антивируса?

    @Drno
    Достаточно и 0 антивирусов, всё от рук зависит
    Ответ написан
    Комментировать
  • Достаточно ли одного Windows Defender в качестве единственного антивируса?

    @As56
    Смотря какая информация хранится на пк. Если очень важная, лучше поставить что-то посерьезнее с фаерволом и антишпионом
    Ответ написан
    Комментировать
  • Достаточно ли одного Windows Defender в качестве единственного антивируса?

    @Komandir_Bublik
    Виндовсовый один из лучших, но рекомендую от себя лично если тебя что-то тревожит, просканируй систему тем же Dr.Web CureIt или malwarebytes.
    Ответ написан
    3 комментария
  • Достаточно ли одного Windows Defender в качестве единственного антивируса?

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

    @slide13
    frontend/web-developer
    Подозреваю, что проблема в https и запрос на http://localhost:5000/add-user/ будет работать. Для https нужен ssl сертификат, а в коде сервера не вижу создания https сервера.
    Ответ написан
    Комментировать
  • Почему существует 2 версии PHP (Non Thread Safe и Thread Safe)?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Здесь ответ на ваш вопрос.

    Для тех, кто не знает английский.

    Версию сервера нужно выбирать в зависимости от того, как вы интегрируете PHP c веб-сервером.
    Например, когда вы используете mod_php, у вас модуль и PHP всегда загружены в память и каждый запрос обрабатывается в отдельном потоке. Из-за этого mod_php работает быстрее, чем CGI. В данном случае нужно использовать потоко-безопасную реализацию (thread-safe) поскольку каждый поток имеет доступ к памяти другого потока.

    Когда вы работаете с IIS, у вас PHP запускается ввиде отдельного процесса через CGI и в таком случае потоко-безопасность не имеет смысла, поскольку у вас 1 процесс и фактически 1 поток созданный этим же процессом. Операционная система изолирует память процессов по умолчанию.

    В случае модели с FastCGI, потокобезопасность также не имеет смысла, поскольку тотже PHP-FPM держит несколько отдельных процессов PHP в памяти, но не потоков.
    Ответ написан
    Комментировать
  • Чем в PHP 8.2 теперь заменять функцию mb_convert_encoding()?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Комментировать