[Разработка веб-сайтов, PHP, Symfony, Yii, Laravel] Зачем нужен static при объявлении анонимных функций?
    
    
        
    
    
    
    
            
    
        
            
                
                                    
                
                                    
                
                    
                
            
        
    
    
        
            
                
                
                    
                           
                    
                        Автор 
                        Сообщение 
                    
                                        
                        
                            
                                
                                
                                                                                                            news_bot ®
                                                                        
                                                                                                                                                
                                                                            
                                                                                                                
                                            Стаж: 7 лет 8 месяцев                                        
                                                                                                                
                                            Сообщений: 27286                                        
                                                                                                                                                
                                                             
                            
                                
                             
                         
                        
                            
                                
                                    
                                        
                                        
 Буквально на днях пришел вопрос от одного из подписчиков касательно одного из постов моего telegram канала. Его смутил вот такой кусок кода
<?php
usort($firstArray, static function($first, $second) {
    return $first <=> $second;
});
Звучал он так:
Зачем делать callback’и в функции сортировки (usort), статическими?
И я подумал, что это действительно хороший вопрос, на который стоит обратить внимание.В чем проблема?Начнем с определения из документации, чтобы засинхронизироваться:
Там-же, но это почти никто не читает :
При объявлении в контексте класса, текущий класс будет автоматически связан с ним, делая $this доступным внутри функций класса. Если вы не хотите автоматического связывания с текущим классом, используйте статические анонимные функции.
Выходит, что когда Сlosure объявляется в контексте класса, то класс автоматически привязывается к замыканию. Это означает, что $this доступен внутри области анонимной функции:
Код, чтобы протестить самостоятельно
<?php
class ExampleTest extends TestCase
{
    public function testBasicTest(): void
    {
        $array = [2, 1];
        usort($array, function ($first, $second) {
            var_dump($this);
            return $first <=> $second;
        });
         self::assertTrue(true);
    }
}
На первый взгляд "да и чёрт с ним", но стоит копнуть чуть глубже.Замыкание, содержащее ссылку на $this, может быть не обработано сборщиком мусора, что, в свою очередь, может существенно повлиять на производительность. Вот пример без использования static:
<?php
class LargeObject {
    protected $array;
    public function __construct() {
        $this->array = array_fill(0, 2000, 15);
    }
    public function getItemProcessor(): Closure {
        return function () { // Внутри функции любые вычисления
            $a = 1;
            $b = 2;
            return $a + $b;
        };
    }
}
function getPeakMemory(): string
{
    return sprintf('%.2F MiB', memory_get_peak_usage() / 1024 / 1024);
}
$start = microtime(true);
$processors = [];
for ($i = 0; $i < 2000; $i++) {
    $lo = new LargeObject();
    $processors[] = $lo->getItemProcessor();
}
var_dump(getPeakMemory());
Как результат, мы получим string(10) "134.10 MiB"Но в случае, если мы добавим static в 11 строке, то потребление памяти составит string(8) "1.19 MiB"Всё потому, что в processors[] мы продолжаем накапливать массив, внутри которого находятся Сlosures которые связаны с классом, а значит, содержат все те данные, которые в нём хранятся.ВыводыЕсли подвести короткий итог, то анонимные функции без static стоит использовать если вам необходимо привязать объект к области видимости выполнения функции. Во всех остальных случаях можно и нужно использовать static, как минимум, чтобы случайно не выстрелить себе в ногу.P.S.Часто для полноценного поста на Хабре мало короткой заметки. Такие выдержки я публикую в своем телеграм-канале https://t.me/beerphp. Подписывайся и сможешь получить больше интересного материала ;)
===========
 Источник:
habr.com
===========
Похожие новости:
- [Разработка веб-сайтов, Работа с видео, Программирование, Видеоконференцсвязь] Стриминг множества RTSP IP камер на YouTube и/или Facebook
 
- [PHP, Разработка мобильных приложений, Визуализация данных, Финансы в IT] Телеграмм-бот для анализа опционов
 
- [Разработка веб-сайтов, Фриланс, Карьера в IT-индустрии, Читальный зал] Длинная история про то, как мы веб-разработчика на фрилансерских сайтах искали, но так и не нашли
 
- [Разработка веб-сайтов, Анализ и проектирование систем] UML умер, а никто и не заметил? (перевод)
 
- [Разработка веб-сайтов, Data Mining] Несколько мыслей про ранжирование
 
- [PHP, IT-инфраструктура, IT-стандарты, Бизнес-модели, Софт] Есть будущее у Fullstack-разработчиков?
 
- [Разработка веб-сайтов, ReactJS, Serverless] Реализация подписки на обновления с помощью Google Sheets, Netlify Functions и React. Часть 1
 
- [Разработка веб-сайтов, CSS, JavaScript, HTML, Node.JS] Как я сделал свою сборку Gulp для быстрой, лёгкой и приятной вёрстки
 
- [Разработка веб-сайтов, JavaScript, Программирование, Совершенный код] Погружение во внедрение зависимостей (DI), или как взломать Матрицу
 
- [PHP, Конференции] Уходим в кэш в высоконагруженных системах
Теги для поиска: #_razrabotka_vebsajtov (Разработка веб-сайтов), #_php, #_symfony, #_yii, #_laravel, #_php, #_static, #_closure, #_anonymous, #_anonymous_function, #_razrabotka_vebsajtov (
Разработка веб-сайтов
), #_php, #_symfony, #_yii, #_laravel
                                        
                                        
                                        
                                     
                                    
                                    
                                                                    
                                                                                             
                         
                        
                            
                                                                    
                                                             
                         
                    
                    
                
                
            
        
    
    
    
    
    
            
    
            
    
        
    
    
        
                        Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
    
    
        
        Текущее время: 31-Окт 12:50
Часовой пояс: UTC + 5 
            
    
                
| Автор | Сообщение | 
|---|---|
| news_bot ® 
                                                                            
                                                                                                                
                                            Стаж: 7 лет 8 месяцев                                         | |
| Буквально на днях пришел вопрос от одного из подписчиков касательно одного из постов моего telegram канала. Его смутил вот такой кусок кода <?php usort($firstArray, static function($first, $second) { return $first <=> $second; }); Зачем делать callback’и в функции сортировки (usort), статическими? При объявлении в контексте класса, текущий класс будет автоматически связан с ним, делая $this доступным внутри функций класса. Если вы не хотите автоматического связывания с текущим классом, используйте статические анонимные функции.  Код, чтобы протестить самостоятельно <?php class ExampleTest extends TestCase { public function testBasicTest(): void { $array = [2, 1]; usort($array, function ($first, $second) { var_dump($this); return $first <=> $second; }); self::assertTrue(true); } } <?php class LargeObject { protected $array; public function __construct() { $this->array = array_fill(0, 2000, 15); } public function getItemProcessor(): Closure { return function () { // Внутри функции любые вычисления $a = 1; $b = 2; return $a + $b; }; } } function getPeakMemory(): string { return sprintf('%.2F MiB', memory_get_peak_usage() / 1024 / 1024); } $start = microtime(true); $processors = []; for ($i = 0; $i < 2000; $i++) { $lo = new LargeObject(); $processors[] = $lo->getItemProcessor(); } var_dump(getPeakMemory()); =========== Источник: habr.com =========== Похожие новости: 
 Разработка веб-сайтов ), #_php, #_symfony, #_yii, #_laravel | |
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
    Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 31-Окт 12:50
Часовой пояс: UTC + 5 
