Pull to refresh
19
0
Александр Денисюк @denisyukphp

PHP-программист

Send message

Цена не вернётся на прежние уровни, все деньги уже за границей.

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

Да, всё верно. Деструктор не вызовется, если исключение будет брошено внутри класса. В вашем случае класса autoClose.

Деструкторы не вызовутся, если перед ними будет брошено какое-нибудь исключение или выполнится функция die(). Надёжнее сразу в конструкторе определить register_shutdown_function() с нужными условиями. Взгляните на мою глобальную реализацию:


<?php

if (!function_exists('defer')) {

    /**
     * @var callable[]
     */
    $_ENV['deferred_handlers'] = [];

    /**
     * Добавит коллбек в массив $_ENV['deferred_handlers']
     *
     * @param callable $callback
     * @return void
     */
    function defer(callable $callback) {
        array_unshift($_ENV['deferred_handlers'], $callback);
    }

    /** 
     * Выполняет коллбеки после завершения скрипта
     *
     * @return void
     */
    register_shutdown_function(function () {
        foreach ($_ENV['deferred_handlers'] as $callback) {
            $callback();
        }
    });
}

$fh = fopen('data.txt', 'w');

defer(function () use ($fh) {
    fclose($fh);
});

throw new Exception;

// Fatal error: Uncaught Exception in \localhost\index.php:38
// and run deferred handlers from env variable $_ENV['deferred_handlers']

Здесь есть минусы: 1) переменную окружения $_ENV['deferred_handlers'] можно грохнуть или вся $_ENV каким-то магическим образом обнулится; 2) если внутри какого-то отложенного обработчика будет брошено исключение, то вся цепочка вызовов сломается.

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

Сейчас сижу на Yii2, но больше по душе компонентный подход: Slim + пакеты сторонних разработчиков. В зависимости от задачи нужно постепенно наращивать функционал, усложнять бизнес-логику приложения. Здесь многого не надо: пакеты, которые крутятся вокруг HTTP-спецификации; работа с БД (Medoo, Eloquent ORM, Doctrine2); шаблонизатор (как по мне лучший Twig, нативный принципиально не рассматриваю). Но и вся архитектура на вас. Чаще в такие проекты порог входа выше, нежели в любой «тяжёлый» фреймворк.

UploadedFile в любом случае не подойдёт, так как реализация метода move() отличается от такого же из класса File. UploadedFile строго для $_FILES, посмотрите исходники. Статья не об этом, временный файл можно передать куда угодно и с чем угодно, тут всё зависит от конкретной задачи. Я использовал File, т. к. была явная зависимость в дочернем классе.

Несмотря на то, что UploadedFile наследует File, задача была другая. UploadedFile предполагает загрузку файлов из $_FILES всё таки.

Функция register_shutdown_function() регистрирует функцию, которая будет выполнена по завершению скрипта. Свой класс я покрыт тестами. Всё отработает как задумано.

Да, использовался. Временный файл перемещался из временной папки куда-то на диск для хранения с помощью метода move() или удалялся, если валидацию не проходил. Пустую строку никак нельзя было отправить.

SplTempFileObject является обёрткой для php://temp и php://memory. Метод getPathname() не вернёт URI, а укажет на тот же поток (php://temp). Это всё тот же fopen(), только через объект. SplTempFileObject имеет баги от класса SplFileInfo, который наследует через SplFileObject, т. к. getRealPath() показывает не тот результат, который ожидается.


Здесь даже не ООП был нужен, а механизм, который может создать c URI временный файл и передать в какой-то класс имя файла. В классе File из Symfony HttpFoundation есть метод move(), который не сможет переместить временный файл, созданный tmpfile(), т. к. тот заблокирован на время работы с потоком. По большому счёту это всё из-за трансферинга временного файла между объектами, которые не работают с потоками, а только с именами файлов.

Мне нужно было передать имя временного файла вместе с классом File из Symfony HttpFoundation в объект, в котором чётко прописана зависимость от класса File в конструкторе. Переписать этот объект я не мог. С моей стороны, бизнес-логика предполагала создание временного файла с определёнными данными, а с другой — валидацию и перемещение, где не предусмотрено удаление файла в случае отрицательной проверки. Два слоя приложения разрабатывались разными программистами. Временный файл наполнялся пользовательскими данными.
Чтобы доказать свою скилл работодателю, можно написать какой-то небольшой сервис будучи студентом или новичком для себя и своих друзей — «just for fun», где будет применён полный стек технологий от бекенда до фронтенда. Естественно всё это должно быть в публичном доступе, дабы работодатель мог оценить все компетенции и примерить их на совместимость со своими задачами. Во первых, делая что-то «just for fun» вы сами прокачаетесь; а во вторых, на основе этого опыта уже можно собрать портфолио и начинать рассылать резюме.
На своём сайте вы сравниваете свою CMS с Битриксом, Вордпрессом, Джумлой и другими. Не думали развиваться в сторону какой-нибудь нишевой CRM и дальше монетизировать её? Потому как рынок CMS сильно перегрет, куча документации и видео по ним, да и такую же систему можно быстро поднять на фреймворке или слепить из компонентов, если будет необходимость.
Для TM Feed нужна авторизация, дабы: 1) формировать ленту согласно персональным хабам; 2) иметь возможность добавлять публикации в закладки; 3) иметь возможность смотреть все закладки в одном месте. Будет не лишним создать персональную RSS-ленту как для публикаций, так и для публикаций из избранного. Про полную AJAX загрузку контента вообще молчу.
Когда покупательская способность инвесторов или спекулянтов исчерпывает свою силу, тогда тренд прекращает свой рост, после чего следует падание, т.е. закрытие длинных позиций, что и есть коррекция к бурному росту, но вот до каких ценовых уровней будет коррекция и коррекция ли это вообще, поможет определить волновая теория Эллиотта.

Картина роста BTC очень сильно напоминает тот самый экспоненциальный рост золота с 2006 до 2012 года, который заканчивается весьма глубокой коррекцией. Может быть откатимся на 50% назад по Bitcoin до 250$ в рамках коррекции или будем дальше расти до неимоверных высот.

image
Красный значок image в начале строки слегка отпугивает, мешает глазу двигаться по списку ссылок, не находите?
Ещё историю с Delicious не стоит забывать, умеет Yahoo покупать сайты.
Какой сервис на скриншоте, не подскажите?

Information

Rating
Does not participate
Location
Брест, Брестская обл., Беларусь
Date of birth
Registered
Activity