Если вы прочитаете документацию по 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)
berezuev
29.05.2018 20:30Мы надеемся, что эти менее известные операторы научили вас кое-чему в PHP.
А также надеемся, что вы никогда не будете применять их в реальном проекте.
pudovMaxim
29.05.2018 21:37+4Он работает так, вы ожидаете, добавляя элемент на правой части в левую частью массива.
Простите, но перевод ужасен.lex111 Автор
29.05.2018 22:07+1Извините, хотел как лучше, переводил со слов автора, может, пожалуйста, подскажите, как по-другому написать, сохранив оригинальную мысль автора?
pudovMaxim
29.05.2018 22:19+1Нет, не подскажу. Сам также перевожу, но выкладывать стесняюсь))
Не помешало бы еще раз пройтись по дословному переводу и слегка «олитературить» текст.lex111 Автор
29.05.2018 22:37+1Поймите меня правильно, при переводе я хотел как можно точнее передать то, что написал автор в оригинале, такой дословный перевод, конечно, это кому нравится, поэтому и требует особого редактирования при публикации, но несмотря на мой провал, я буду стараться над качеством перевода, нужно, конечно, больше практиковаться, а если долгое время не выходит, то нужно заканчивать с переводом, так как, очевидно, это не моё, и лучше это не делать. Но спасибо, буду изучать как делать переводы другие люди, изучать специализированную литературу и тщательнее вычитать публикуемые тексты.
SagePtr
29.05.2018 23:03Поймите меня правильно, при переводе я хотел как можно точнее передать то, что написал автор в оригинале, такой дословный перевод, конечно, это кому нравится, поэтому и требует особого редактирования при публикации, но несмотря на мой провал, я буду стараться над качеством перевода, нужно, конечно, больше практиковаться, а если долгое время не выходит, то нужно заканчивать с переводом, так как, очевидно, это не моё, и лучше это не делать.
Всю эту мысль запихнуть в одно предложение — это ещё надо умудриться)
XAHTEP26
29.05.2018 21:44Очень крутой стеб. ))) Не сразу понял в чем подвох.
Жаль только качество перевода оставляет желать лучшего. Исправьте хотя бы явные орфографические ошибки.lex111 Автор
29.05.2018 22:07Извините, очень мало опыта в переводе, был бы очень признателен, если указали на ошибки, или лучше снять публикацию, чтобы больше не позориться?
XAHTEP26
29.05.2018 23:00+2Ну, например, вы понимаете смысл следующих строк?
Просто добавьте b перед любой строкой, но это ничего сделает, словно строка обычным образом.
Он работает так, вы ожидаете, то есть добавляя элемент с правой части в левую частью массива.
И просто прочтите остальной текст — сами все увидите.
Насчет снятия с публикации — решайте сами. Я бы постарался довести перевод до нормального состояния.lex111 Автор
29.05.2018 23:09Написал выше, но так автор написал, может я неверно понимаю, суть перевода, но я попытался это передать на русский язык.
> Просто добавьте b перед любой строкой, но это ничего сделает, словно строка обычным образом.
Это я сейчас изменил, дополнил но стало хуже. Может я слишком «дословно» хочу всё переводить и получается так? Вот вы как перевели это предложение: «Simply add a b before any string, and it will do nothing»?
> Он работает так, вы ожидаете, то есть добавляя элемент с правой части в левую частью массива.
Это я понимаю, так опять-таки автор написал, добавляется новый элемент -> в правую часть, т.е. в конец.vient
30.05.2018 00:00+1Вот вы как перевели это предложение: «Simply add a b before any string, and it will do nothing»?
"Просто добавьте
b
перед любой строкой, и ничего не произойдёт".
Смысл тот же самый, а смотрится уже не так коряво.
Он работает так, вы ожидаете, то есть добавляя элемент с правой части в левую частью массива.
Этот перевод просто неверный, в оригинале написано про массив слева, а не про левую часть массива. Перевести всё вместе можно как "Он работает так, как вы и ожидаете — добавляет элемент справа в массив слева".
CaptainFlint
29.05.2018 23:37+2Насчёт снятия решать всё же вам, у каждого разные критерии. Но на мой взгляд перевод очень плох, я бы публиковать такое не стал. Всякие опечатки — это ладно, дело наживное. Но вот, скажем, в этом пассаже я концовку вообще не понял:
Просто добавьте b перед любой строкой, но это ничего сделает, словно строка обычным образом.
Пришлось лезть в оригинал. Возможно, это случайный косяк, ибо в оригинале нет ничего, соответствующего концовке, но сама идея дословного перевода — в корне порочна. Русские фразы строятся совсем по-другому, в итоге ваша попытка максимально донести мысль приводит в точности к обратному, что мысль понять невозможно или сложно. Или всё понятно, но фраза выглядит коряво, неестественно.
Конкретных мест много, но пара штук для иллюстрации:
В самом деле, это намного более элегантно, чем $array[] = 'element';.
В английском слово «more» присутствует исключительно потому, что таковы правила образования сравнительной степени многосложных слов. Но в русском-то такого правила нет, человек просто скажет «намного элегантнее».
Константы хороши и эффективны, пока вы не захотите больше свободы к их синтаксису.
Вместо «вы захотите» обычно говорят «вам захочется». А «свобода к их синтаксису» вообще звучит непонятно. Хотя бы «больше свободы в их синтаксисе», а можно в данном случае отойти от следования оригиналу и сказать что-то вроде «пока вас не перестанут устраивать ограничения их синтаксиса».
Вообще, по вопросу о том, до какой степени нужно следовать оригиналу, ведутся яростные и нескончаемые битвы. Кто-то считает, что по возможности нужно повторять авторский текст. Кто-то убеждает, что главное — донести авторскую мысль, а текст может быть хоть задом наперёд (если это способствует главной задаче). А третьи уверены, что ключевым является восприятие, и надо строить перевод таким образом, чтобы русский человек получал те же эмоции и ассоциации, какие получил бы англоязычный человек, читая оригинал. Каждый переводчик в итоге сплавляет в себе из разных составляющих какое-то своё, уникальное мировоззрение, частично включающее в себя эти (и другие) точки зрения.
Главное, как я считаю, делать перевод таким, какой нравится самому себе. На будущее, лучше дать статье полежать хотя бы сутки, при этом совершенно не думать о ней (а думать о белой обезьяне). Потом свежим взглядом перечитать, воспринимая как что-то чужое, как работу конкурента, которого надо ткнуть носом во все ляпы и недочёты. А потом вспомнить, чья это работа на самом деле, и решить, а устраивает ли она в таком виде, как сейчас. Правда тут ещё нужно не скатиться в противоположность и не начать полировать до бесконечности…lex111 Автор
30.05.2018 00:09+1Спасибо за подробное объяснение, просто очень хотелось что-то перевести в один день, вот и результат, но снимать эту статью я не буду, первый блин комом, но и хочется сравнить спустя некоторого времени, изменились качественно мои переводы или нет. Эта статья будет лакмусовой бумажкой для других переводов, потому что мне это интересно, и хочется продолжать это делать, но уже не на этой площадке, лучше тогда на медиуме, там мало кто тебя прочтёт, но в любом случае это хорошо. Так что ещё раз, спасибо, получилась не статья про операторы, а сборник ликбезов, простите отдельно за это, намотаю себе на ус.
Понял свою основную ошибку — переводить слишком дословно, мало уделяя внимания получившемуся результату, как он звучит по-русски, это проблема, но, думаю, решается опытом и непрерывным обучением, а опыта в написании вообще, у меня крайне мало по сравнению с остальными людьми.
Urichalex
29.05.2018 21:54-2Буквально вчера читал оригинал статьи. Вопрос к автору, почему Вы не указали ссылку на оригинал? Многие, как и я, предпочитают читать в оригинале
Mixalych
29.05.2018 22:53+1Такое, как звезда смерти, использовать лучше в первых строках приветствия интерпретатора, и то шутки ради — мол такой код тоже валиден. Моментов (операторов), вводящих в заблуждение, имхо лучше вообще не использовать, тем более в продакшене. Я сегодня не мог понять, почему не все переменные массива
$arr = [ 'key1' => 'value1', 'key2' > 'value2', 'key3' => 'key3', ];
curl передает. IDE не подсвечивает ошибки, да ее и нет — просто второй элемент будет логический — истина или ложь.
А тут еще больший зоопарк предлагается использовать.
Skycaptain
30.05.2018 05:39Делайте вычитку перед публикацией, пожалуйста
lex111 Автор
30.05.2018 10:00Вычитку делаю, тут скорее дело в невнимательности и в недостатке опыта в целом, но спасибо за фидбек.
m0rtis
30.05.2018 09:31А я вот, честно сказать, не понял, почему эта статья сначала попала в дайджест, а потом и в перевод. Ничего такого сверх остроумного я не углядел… Может, просто не выспался?:)
lex111 Автор
30.05.2018 09:59Вы имеете в виду, статьи из дайджеста, не должны переводиться? Да, статья, совсем несложная, но не все может читают дайджест, некоторые может пропустили его, другие просто не смотрели оригинальную статью, причины разные. Возможно, эта не та статья, которую стоит перевода, но мне захотелось попробовать. Вышло не очень удачно, но это тоже хороший опыт, я теперь знаю о своих ошибках в переводе, и буду впредь лучше это делать.
stepmex
30.05.2018 10:02Оператор []=
Это не оператор, это автор неуч.
Все эти записи эквивалентны:
$a[] = 5; $a[]=5; $a []= 5; $a [] = 5; $a [ ] = 5; $a [ ] = 5 ;
И делают одно и то же — добавляют элемент в конец массива.
php как и многие другие языки очень не прихотливы к количеству и наличию пробелов в некоторых местахlex111 Автор
30.05.2018 12:25Это не оператор,
А как это тогда называется, если это не оператор? Это бинарный оператор, у которого два операнда — массивы, или я ошибаюсь?
php как и многие другие языки очень не прихотливы к количеству и наличию пробелов в некоторых местах
Разумеется, это очевидно, как следующий тест, если рассматривать каждое добавление отдельно друг от друга.
$array = []; $array []= 'element'; // время выполнения - 219 мс $array[] = 'element'; // время выполнения - 250 мс $array[]='element'; // время выполнения - 187 мс
lex111 Автор
30.05.2018 12:33> у которого два операнда — массивы
Ошибся, конечно, правый операнд не обязательно должен быть массивом.
sumanai
30.05.2018 13:01Опкешер по идее должен приводить всё это в одинаковое синтаксические дерево и его кешировать.
SerafimArts
30.05.2018 15:03Опкеш не синтаксическое дерево кешит, а опкод. А он (опкод) не зависит от опкеша, а генерится самим пыхом. Ну и да, внутри пыха эти инструкции ничем не отличаются и, думаю, это крайне очевидно.… ну разве что лексер парсит разное количество токенов.
stepmex
30.05.2018 16:55Я не о том как это называется или с какой скоростью выполняется.
Я пытался донести что этому оператору не место в данном списке, он доступен с момента появления массивов.
Автор статьи просто переставил пробелы и назвал это чем-то странным. Переставляя пробелы можно кучу месть переделать в что-то странное, что я и показал примером.
PS ну да, очень громко и не так выразился, простите.sumanai
30.05.2018 17:23+2Большая часть «операторов» в статье это переставление пробелов и комбинация нескольких. Юмор такой, статья юмористическая.
Hardcoin
30.05.2018 21:52+1Можно методику тестирования? 200 мс (четверть секунды!) на добавление элемента — это какой-то трэш и крайне далеко от правды. Или это время вместе с запуском интерпретатора?
m0rtis
30.05.2018 10:02Нет-нет, Вы неверно меня поняли! Я вовсе не против переводов. И Ваш перевод совсем не вызывает отторжения. Есть огрехи, Вы готовы их исправлять — это замечательно. Продолжайте. Я именно про ценность оригинальной статьи. Она не показалась мне достойной включения в дайджест и перевода.
bolk
30.05.2018 10:10К сожалению, в официальном руководстве нет ни слова об этой замечательной возможности.
Гм, правда? php.net/manual/ru/function.array-push.phplex111 Автор
30.05.2018 12:28В документации, конечно, есть про оператор
[]=
, но не расписано, но вся суть в том, что пробелы влияют на время выполнения операции, как я показал в комментарии выше https://habr.com/post/412603/?reply_to=18709857#comment_18710621
Конечно, кто-то скажет, что это экономия на списках, для этого может это не так очевидно, но ясно одно — важность пробелов трудно переоценить.
Survtur
Хотел написать, что корабли — это вовсе не какие-то особые операторы, а потом посмотрел внимательно на всё остальное…
Вот только про b'string' не понял.
morozovsk
Аналогично, сначала поражался, зачем нужно было в php добавлять такие странные операторы.
начал подозревать подставу, а после этого:после этого:
всё стало на свои места и то только потому что видел такое один раз в продакшн коде, а некоторые из остальных бывает задают на собеседовании, когда не до чего докопаться.
это единственный честный случай, этот оператор влияет только на PHP6, на остальные версии не влияет, потому что в них все строки — бинарные.
PS: автору надо бы добавить тег юмор, а то после тяжёлого рабочего дня можно прочесть статью и не понять, что это вовсе не специальные операторы, тем более что текст читается достаточно сложно.
lex111 Автор
А как вы бы перевели на русский? Пожалуйста, можете мне объяснить, я скорректирую перевод, так будет лучше для всех. Заранее спасибо.