Использование анонимных классов и (‘Spaceship’) оператора в PHP

Поддержка анонимнынх классов добавлена в  PHP 7.

Некоторые моменты об анонимных классах в PHP:

Синтаксис почти идентичен именованому классу, это просто класс без имени. Вот почему он называется Анонимный класс.

Что вы можете сделать, используя анонимные классы:

  • можно назначить его переменной
  • может вернуться из функции
  • может передаваться как аргумент функции
  • почти как обычный класс – может расширять класс, может реализовывать интерфейсы, использовать трейты
  • не может быть сериализован

Более подробный обзор анонимных классов см. в документации.

Случаи использования анонимных классов в PHP:

  • создание простых одноразовых объектов
  • в модульном тестировании

Подробнее описано в RFC.

Достаточно воды, давайте перейдем к сценарию реального использования.

У нас есть ресурс API, который возвращает пользователей. Наша задача состоит в том, чтобы напечатать имена пользователей в порядке убывания количества фоловеров. (т.е. отсортировать по количеству фоловеров)

Ответ от json выглядит так (с большим количеством объектов):

[
 {
        "text": "Voluptate aliqua consectetur reprehenderit fugiat cillum labore id dolore cillum sint ad tempor commodo. Veniam aute duis Lorem ea nisi exercitation elit officia. Cillum esse ea dolore ullamco anim aliquip est.\r\n", 
        "created_at": "2014-02-25T09:20:21 -06:-30", 
        "id": "59821540f0d11ec0019f907e", 
        "user": {
            "followers_count": 893747, 
            "name": "Nunez", 
            "id": "89cc4635-6404-40b9-b15b-82e3514ab4c8"
        }
    }, 
    {
        "text": "Cupidatat fugiat sunt reprehenderit incididunt aute adipisicing magna cupidatat nulla consectetur anim magna. Id occaecat incididunt in nostrud amet. Aute dolore proident occaecat elit consectetur. Exercitation mollit cillum dolore culpa ea ipsum tempor est. Magna ipsum ex amet elit excepteur.\r\n", 
        "created_at": "2015-08-21T08:26:19 -06:-30", 
        "id": "59821540c8e9abd4618e9034", 
        "user": {
            "followers_count": 311461, 
            "name": "Chang", 
            "id": "f0e283d0-bfd6-4c06-89f9-a4c71b7c5f17"
        }
    }
]

теперь давайте реализуем решение

<?php

$json = json_decode(file_get_contents("https://gist.githubusercontent.com/anonymous/65a02c91a2a2ea087198a9be74e7dbc4/raw/45359731cd00119c4f761ff813e6b76a4c8e22bf/users.json"), true);

$topUsers = new class() extends \SplHeap
{
    protected function compare($value1, $value2)
    {
        return (int)$value1['user']['followers_count'] <=> (int)$value2['user']['followers_count'];
    }
};

foreach ($json as $data) {
    $topUsers->insert($data);
}

echo "User"." - "."Followers".PHP_EOL;
foreach ($topUsers as $user) {
    echo $user['user']['name'].' - '.$user['user']['followers_count'].PHP_EOL;
}

O/P

User - Followers
Lorena - 1441740
Mcfadden - 1432646
Angel - 1416512
Jana - 1399750
Laurie - 1373911
Louisa - 1237079
Avila - 1228972
Hoffman - 1151910
Robert - 1138613
Patty - 1095499
Sylvia - 1055464
Bobbi - 1053050
Fitzgerald - 1038147
Morrow - 998797
Nunez - 893747
Stanley - 810207
Scott - 790395
Natalie - 761451
Hurley - 709661
Lang - 575764
Mccullough - 550085
Matilda - 481552
Santiago - 464343
Fuller - 442185
Callahan - 433387
Morgan - 403480
Clemons - 351374
Boyle - 351141
Leona - 323783
Chang - 311461
Madge - 289641
Tucker - 274473
Grace - 229155
Aisha - 211126
Knight - 207963
Walsh - 142328
Hollie - 120530
Reynolds - 89821
Clements - 78024
Acevedo - 47894

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.