Если вы прочитаете документацию по PHP, вы узнаете о массе операторов. Если вы не знаете ещё PHP-операторы, сперва изучите их, а потом вернитесь к прочтению этой статьи.


Судя по первым комментариям, хочу извиниться за плохой перевод, опыта у меня в этом мало, но хотелось перевести статью. Я буду рад любой критике относительно качества перевода, особенно за любые улучшения. Спасибо за внимание!

Операторы обычно состоят из странных символов, таких как !, -, =>, <=>, ^ or ~. Действительно, некоторые из них просто читаются, например AND, в то время как некоторые из них — упущенная попытка сделать их читаемыми и скрыть их фактически двойную индивидуальность, например, xor.


Вероятно, вы думаете, что знаете документацию PHP вдоль и поперёк, но всегда найдётся, чему поучиться. Поэтому я глубоко погрузился в код ядра PHP и посмотрел некоторые особенные операторы PHP, менее известные, но очень полезные в ежедневной работе.


Итак, вот 10 операторов PHP, которые вы должны знать в 2018 году!


Оператор b’


Просто добавьте b перед любой строкой, и ничего не произойдёт. Этот ловкий трюк работает только с b и B. Здесь мы должны напомнить о судьбе PHP 6, поскольку b похож на 6.


$string = b'content';

Оператор []=


Короткий оператор добавления нового элемента в массив. Он работает так, как вы и ожидаете — добавляет элемент справа в массив слева.


$array []= 'element';

В самом деле, это намного элегантнее, чем $array[] = 'element';. Некоторые тесты показывают, что это намного быстрее, в то время как другие наоборот, что это намного медленнее. Как обычно, посмотрите сами, подходит ли данный оператор вам, прежде чем делать ставку на производительность подобным трюком.


К сожалению, в официальном руководстве нет ни слова об этой замечательной возможности.


Оператор <-


Оператор "левого объекта" был введен в PHP для расширения возможности написания кода, для того чтобы разработчики могли писать PHP-код справа налево. Хотя позже проект был прекращён по непонятным причинам, этот первый оператор, получивший поддержку, сохранился в PHP.


$c = $a<-B; 

В целях обратной совместимости вышеприведённый код не получит значение свойства B в объекте $a, а просто сравнивает $a с противоположностьюB.


Оператор ––>


--> также известен как "оператор супер-объекта", создан на основе своего дальнего двоюродного брата, ->.


$object-->property

--> работает как ->, за исключением того, что это не так. Основная хитрость: использовать не объект в качестве переменной $object, а целое число (в таком случае будет это будет работать как сравнение > — прим. пер.)


Оператор "стрелки влево" для массивов [$a <= $b]


Все мы знаем оператор => для массивов, но они также поддерживают зеркальную версию этого оператора следующим образом:


$array = [
    'a'  => 'b', 
    'c' <= 'd',
];

var_dump($array);
/*
array(2) {
  ["a"]=>
  string(1) "b"
  [0]=>
  bool(true)
*/

Это очень удобно для очень молодых программистов, а также тех, кто постарше, всё ещё использующих зеркальное написание. Этот оператор также имеет возможность превращать оба операнда в логическое значение, для более компактного хранения.


Имена констант с *, %


Константы хороши и эффективны, пока вам вам не захочется больше свободы в их синтаксисе. Хотя в руководстве указано, что имя константы должно содержать только буквы, символы подчёркивания и цифры, но также разрешено использовать специальные символы типа * или % в имени. Например, следующим образом:


// Далее три строки кода даны для пояснения того, что имел в виду автор статьи — прим. пер.
define('A', 2);
define('B', 1);
define('A*B', 2);

$x = foo( A*B );

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


Операторы "кораблей"


Итак, все знают об операторе "космический корабль" <=> с момента выхода PHP 7. Но менее известно, что одновременно с этим релизом был введён целый флот космических кораблей для проведения крупномасштабных операций.


Крошечный космический корабль


Вы можете предоставить эскорт оператору космического корабля, используя крошечный оператор космического корабля. Этот оператор не делает сравнение: он просто добавляет $b к $a в таком изысканном стиле.


$a -=- $b;

X-истребители


Если вы хотите добавить огневую мощь к предыдущему флоту, вы можете вызвать истребителей типа X к источнику PHP: +-0-+. Следующий код вычитает 3 у $a (в оригинальной статье написано, что оператор прибавит 3 (adds 3 to $a), но это не так, см. вывод примера ниже — прим. пер.)


$a = 8;
$a = $a +-0-+ 3; // 5

Линейный корабль


Оператор линейного корабля обеспечивает поддержку предыдущих операторов. Это один из операторов, работающий только с массивами, точно так же, как =>. Его следует использовать только самым продвинутым гуру PHP на этой стороне галактики. Не стоит недооценивать его силу.


$x = [ 2 <=['-']=> $b];

Разве не лучший способ написать так?


$x = [ 1 => $b];

Звезда Смерти


Многие из вас бы спросили, а был ли встроен в PHP оператор "звезда смерти", и ответ таков: в данный момент неизвестно. Есть планы на это, но никто никогда не видел реального экземпляра. Мне бы очень хотелось видеть оператор в три строки, так как PHP будет первым, кто будем иметь подобное (и, когда это произойдёт, надеюсь, не с моего счёта спишут стоимость этого оператора).


 $x = $y ~~
        ( °) 
         ~~  true; 

Безумие оператора PHP


Операторы PHP — аккуратные и эффективные. Мы надеемся, что эти менее известные операторы научили вас кое-чему в PHP.


Проверьте приведённые примеры кода: все они работают в PHP 7.2.5, кроме "звезды смерти". Они могут иметь некоторые предварительные условия, поэтому обязательно прочитайте документацию перед их использованием.

Комментарии (44)


  1. Survtur
    29.05.2018 20:10

    Хотел написать, что корабли — это вовсе не какие-то особые операторы, а потом посмотрел внимательно на всё остальное…
    Вот только про b'string' не понял.


    1. morozovsk
      29.05.2018 21:42
      +2

      Аналогично, сначала поражался, зачем нужно было в php добавлять такие странные операторы.
      после этого:

      $object-->property
      начал подозревать подставу, а после этого:
      [$a <= $b]
      всё стало на свои места и то только потому что видел такое один раз в продакшн коде, а некоторые из остальных бывает задают на собеседовании, когда не до чего докопаться.
      Вот только про b'string' не понял.
      это единственный честный случай, этот оператор влияет только на PHP6, на остальные версии не влияет, потому что в них все строки — бинарные.
      PS: автору надо бы добавить тег юмор, а то после тяжёлого рабочего дня можно прочесть статью и не понять, что это вовсе не специальные операторы, тем более что текст читается достаточно сложно.


    1. lex111 Автор
      29.05.2018 22:38

      А как вы бы перевели на русский? Пожалуйста, можете мне объяснить, я скорректирую перевод, так будет лучше для всех. Заранее спасибо.


  1. berezuev
    29.05.2018 20:30

    Мы надеемся, что эти менее известные операторы научили вас кое-чему в PHP.

    А также надеемся, что вы никогда не будете применять их в реальном проекте.


  1. pudovMaxim
    29.05.2018 21:37
    +4

    Он работает так, вы ожидаете, добавляя элемент на правой части в левую частью массива.


    Простите, но перевод ужасен.


    1. lex111 Автор
      29.05.2018 22:07
      +1

      Извините, хотел как лучше, переводил со слов автора, может, пожалуйста, подскажите, как по-другому написать, сохранив оригинальную мысль автора?


      1. pudovMaxim
        29.05.2018 22:19
        +1

        Нет, не подскажу. Сам также перевожу, но выкладывать стесняюсь))
        Не помешало бы еще раз пройтись по дословному переводу и слегка «олитературить» текст.


        1. lex111 Автор
          29.05.2018 22:37
          +1

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


          1. SagePtr
            29.05.2018 23:03

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

            Всю эту мысль запихнуть в одно предложение — это ещё надо умудриться)


      1. GRaAL
        29.05.2018 23:09

        Можно как-то так:
        Он работает ожидаемо: добавляет то, что справа, в массив слева.


        1. lex111 Автор
          29.05.2018 23:13

          Спасибо, заменю на ваш фрагмент.


  1. XAHTEP26
    29.05.2018 21:44

    Очень крутой стеб. ))) Не сразу понял в чем подвох.
    Жаль только качество перевода оставляет желать лучшего. Исправьте хотя бы явные орфографические ошибки.


    1. lex111 Автор
      29.05.2018 22:07

      Извините, очень мало опыта в переводе, был бы очень признателен, если указали на ошибки, или лучше снять публикацию, чтобы больше не позориться?


      1. XAHTEP26
        29.05.2018 23:00
        +2

        Ну, например, вы понимаете смысл следующих строк?

        Просто добавьте b перед любой строкой, но это ничего сделает, словно строка обычным образом.
        Он работает так, вы ожидаете, то есть добавляя элемент с правой части в левую частью массива.
        И просто прочтите остальной текст — сами все увидите.

        Насчет снятия с публикации — решайте сами. Я бы постарался довести перевод до нормального состояния.


        1. lex111 Автор
          29.05.2018 23:09

          Написал выше, но так автор написал, может я неверно понимаю, суть перевода, но я попытался это передать на русский язык.

          > Просто добавьте b перед любой строкой, но это ничего сделает, словно строка обычным образом.

          Это я сейчас изменил, дополнил но стало хуже. Может я слишком «дословно» хочу всё переводить и получается так? Вот вы как перевели это предложение: «Simply add a b before any string, and it will do nothing»?

          > Он работает так, вы ожидаете, то есть добавляя элемент с правой части в левую частью массива.

          Это я понимаю, так опять-таки автор написал, добавляется новый элемент -> в правую часть, т.е. в конец.


          1. vient
            30.05.2018 00:00
            +1

            Вот вы как перевели это предложение: «Simply add a b before any string, and it will do nothing»?

            "Просто добавьте b перед любой строкой, и ничего не произойдёт".
            Смысл тот же самый, а смотрится уже не так коряво.


            Он работает так, вы ожидаете, то есть добавляя элемент с правой части в левую частью массива.

            Этот перевод просто неверный, в оригинале написано про массив слева, а не про левую часть массива. Перевести всё вместе можно как "Он работает так, как вы и ожидаете — добавляет элемент справа в массив слева".


            1. lex111 Автор
              30.05.2018 00:01

              Спасибо, действительно нужно ещё многому учиться.


      1. CaptainFlint
        29.05.2018 23:37
        +2

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

        Просто добавьте b перед любой строкой, но это ничего сделает, словно строка обычным образом.
        Пришлось лезть в оригинал. Возможно, это случайный косяк, ибо в оригинале нет ничего, соответствующего концовке, но сама идея дословного перевода — в корне порочна. Русские фразы строятся совсем по-другому, в итоге ваша попытка максимально донести мысль приводит в точности к обратному, что мысль понять невозможно или сложно. Или всё понятно, но фраза выглядит коряво, неестественно.
        Конкретных мест много, но пара штук для иллюстрации:
        В самом деле, это намного более элегантно, чем $array[] = 'element';.
        В английском слово «more» присутствует исключительно потому, что таковы правила образования сравнительной степени многосложных слов. Но в русском-то такого правила нет, человек просто скажет «намного элегантнее».
        Константы хороши и эффективны, пока вы не захотите больше свободы к их синтаксису.
        Вместо «вы захотите» обычно говорят «вам захочется». А «свобода к их синтаксису» вообще звучит непонятно. Хотя бы «больше свободы в их синтаксисе», а можно в данном случае отойти от следования оригиналу и сказать что-то вроде «пока вас не перестанут устраивать ограничения их синтаксиса».

        Вообще, по вопросу о том, до какой степени нужно следовать оригиналу, ведутся яростные и нескончаемые битвы. Кто-то считает, что по возможности нужно повторять авторский текст. Кто-то убеждает, что главное — донести авторскую мысль, а текст может быть хоть задом наперёд (если это способствует главной задаче). А третьи уверены, что ключевым является восприятие, и надо строить перевод таким образом, чтобы русский человек получал те же эмоции и ассоциации, какие получил бы англоязычный человек, читая оригинал. Каждый переводчик в итоге сплавляет в себе из разных составляющих какое-то своё, уникальное мировоззрение, частично включающее в себя эти (и другие) точки зрения.

        Главное, как я считаю, делать перевод таким, какой нравится самому себе. На будущее, лучше дать статье полежать хотя бы сутки, при этом совершенно не думать о ней (а думать о белой обезьяне). Потом свежим взглядом перечитать, воспринимая как что-то чужое, как работу конкурента, которого надо ткнуть носом во все ляпы и недочёты. А потом вспомнить, чья это работа на самом деле, и решить, а устраивает ли она в таком виде, как сейчас. Правда тут ещё нужно не скатиться в противоположность и не начать полировать до бесконечности…


        1. lex111 Автор
          30.05.2018 00:09
          +1

          Спасибо за подробное объяснение, просто очень хотелось что-то перевести в один день, вот и результат, но снимать эту статью я не буду, первый блин комом, но и хочется сравнить спустя некоторого времени, изменились качественно мои переводы или нет. Эта статья будет лакмусовой бумажкой для других переводов, потому что мне это интересно, и хочется продолжать это делать, но уже не на этой площадке, лучше тогда на медиуме, там мало кто тебя прочтёт, но в любом случае это хорошо. Так что ещё раз, спасибо, получилась не статья про операторы, а сборник ликбезов, простите отдельно за это, намотаю себе на ус.
          Понял свою основную ошибку — переводить слишком дословно, мало уделяя внимания получившемуся результату, как он звучит по-русски, это проблема, но, думаю, решается опытом и непрерывным обучением, а опыта в написании вообще, у меня крайне мало по сравнению с остальными людьми.


  1. Urichalex
    29.05.2018 21:54
    -2

    Буквально вчера читал оригинал статьи. Вопрос к автору, почему Вы не указали ссылку на оригинал? Многие, как и я, предпочитают читать в оригинале


    1. MaximChistov
      29.05.2018 22:07
      +4

      Он все указал
      image


    1. Stecenko
      29.05.2018 22:08
      +3

      Ссылка на оригинал сразу под заголовком статьи.


      1. Urichalex
        29.05.2018 22:09
        +1

        Моя невнимательность…


  1. index0h
    29.05.2018 22:10

    Магия форматирования))


  1. Mixalych
    29.05.2018 22:53
    +1

    Такое, как звезда смерти, использовать лучше в первых строках приветствия интерпретатора, и то шутки ради — мол такой код тоже валиден. Моментов (операторов), вводящих в заблуждение, имхо лучше вообще не использовать, тем более в продакшене. Я сегодня не мог понять, почему не все переменные массива

    $arr = [
      'key1' => 'value1',
      'key2' > 'value2',
      'key3' => 'key3',
    ];
    

    curl передает. IDE не подсвечивает ошибки, да ее и нет — просто второй элемент будет логический — истина или ложь.

    А тут еще больший зоопарк предлагается использовать.


  1. Fragster
    29.05.2018 23:15
    +1

    Первого апреля статья была бы в тему, ну или хотя бы в пятницу.


  1. Skycaptain
    30.05.2018 05:39

    Делайте вычитку перед публикацией, пожалуйста


    1. lex111 Автор
      30.05.2018 10:00

      Вычитку делаю, тут скорее дело в невнимательности и в недостатке опыта в целом, но спасибо за фидбек.


  1. m0rtis
    30.05.2018 09:31

    А я вот, честно сказать, не понял, почему эта статья сначала попала в дайджест, а потом и в перевод. Ничего такого сверх остроумного я не углядел… Может, просто не выспался?:)


    1. lex111 Автор
      30.05.2018 09:59

      Вы имеете в виду, статьи из дайджеста, не должны переводиться? Да, статья, совсем несложная, но не все может читают дайджест, некоторые может пропустили его, другие просто не смотрели оригинальную статью, причины разные. Возможно, эта не та статья, которую стоит перевода, но мне захотелось попробовать. Вышло не очень удачно, но это тоже хороший опыт, я теперь знаю о своих ошибках в переводе, и буду впредь лучше это делать.


      1. m0rtis
        30.05.2018 10:08

        Извините, по ошибке ответил не на Ваше сообщение, а в корне обсуждения.


  1. stepmex
    30.05.2018 10:02

    Оператор []=

    Это не оператор, это автор неуч.
    Все эти записи эквивалентны:
    $a[] = 5;
    $a[]=5;
    $a []= 5;
    $a         []             =                5;
    $a         [                   ]             =                5;
    $a
    [      
    ]
    =
    5
    ;

    И делают одно и то же — добавляют элемент в конец массива.

    php как и многие другие языки очень не прихотливы к количеству и наличию пробелов в некоторых местах


    1. lex111 Автор
      30.05.2018 12:25

      Это не оператор,

      А как это тогда называется, если это не оператор? Это бинарный оператор, у которого два операнда — массивы, или я ошибаюсь?


      php как и многие другие языки очень не прихотливы к количеству и наличию пробелов в некоторых местах

      Разумеется, это очевидно, как следующий тест, если рассматривать каждое добавление отдельно друг от друга.


      $array = [];
      
      $array []= 'element'; //  время выполнения - 219 мс
      
      $array[] = 'element'; //  время выполнения - 250 мс
      
      $array[]='element'; //  время выполнения - 187 мс


      1. lex111 Автор
        30.05.2018 12:33

        > у которого два операнда — массивы

        Ошибся, конечно, правый операнд не обязательно должен быть массивом.


      1. sumanai
        30.05.2018 13:01

        Опкешер по идее должен приводить всё это в одинаковое синтаксические дерево и его кешировать.


        1. SerafimArts
          30.05.2018 15:03

          Опкеш не синтаксическое дерево кешит, а опкод. А он (опкод) не зависит от опкеша, а генерится самим пыхом. Ну и да, внутри пыха эти инструкции ничем не отличаются и, думаю, это крайне очевидно.… ну разве что лексер парсит разное количество токенов.

          Заголовок спойлера
          Картинки кликабельны







      1. stepmex
        30.05.2018 16:55

        Я не о том как это называется или с какой скоростью выполняется.
        Я пытался донести что этому оператору не место в данном списке, он доступен с момента появления массивов.
        Автор статьи просто переставил пробелы и назвал это чем-то странным. Переставляя пробелы можно кучу месть переделать в что-то странное, что я и показал примером.

        PS ну да, очень громко и не так выразился, простите.


        1. sumanai
          30.05.2018 17:23
          +2

          Большая часть «операторов» в статье это переставление пробелов и комбинация нескольких. Юмор такой, статья юмористическая.


        1. c4boomb
          30.05.2018 18:05
          +2

          Значит остальные "операторы" вас не удивили? Эта статья — шутка


      1. Hardcoin
        30.05.2018 21:52
        +1

        Можно методику тестирования? 200 мс (четверть секунды!) на добавление элемента — это какой-то трэш и крайне далеко от правды. Или это время вместе с запуском интерпретатора?


  1. m0rtis
    30.05.2018 10:02

    Нет-нет, Вы неверно меня поняли! Я вовсе не против переводов. И Ваш перевод совсем не вызывает отторжения. Есть огрехи, Вы готовы их исправлять — это замечательно. Продолжайте. Я именно про ценность оригинальной статьи. Она не показалась мне достойной включения в дайджест и перевода.


  1. bolk
    30.05.2018 10:10

    К сожалению, в официальном руководстве нет ни слова об этой замечательной возможности.
    Гм, правда? php.net/manual/ru/function.array-push.php


    1. lex111 Автор
      30.05.2018 12:28

      В документации, конечно, есть про оператор []=, но не расписано, но вся суть в том, что пробелы влияют на время выполнения операции, как я показал в комментарии выше https://habr.com/post/412603/?reply_to=18709857#comment_18710621
      Конечно, кто-то скажет, что это экономия на списках, для этого может это не так очевидно, но ясно одно — важность пробелов трудно переоценить.


      1. tommyangelo27
        30.05.2018 15:11
        +3

        Выполните в цикле 10000 раз и сравните. 1 запуск ничего не покажет.