Формальная семантика PHP?

Мне поручено изучать PHP, но есть много вещей, которые я не понимаю. Например, концепция "переменных функций" - не та, которую я видел где-либо еще. Есть много других примеров, но для краткости я нашел PHPWTF, в котором есть много примеров специфических особенностей PHP.

Большинство других языков, которые я использовал, имеют либо формальную спецификацию (например, Haskell 2010), либо, по крайней мере, исследовательскую работу по их формальной семантике (например, это для Javascript). Тем не менее, я не могу найти ничего похожего на PHP.

Существует официальная "языковая справка". Тем не менее, он очень неформальный, читается как вики и пропускает целые разделы (например, раздел по синтаксису вообще не определяет синтаксис). Подтверждая, что я подозревал, этот парень говорит мне, что нет ни официальной спецификации, ни даже определенного синтаксиса.

В Википедии есть статья "Синтаксис и семантика PHP", но она касается только синтаксиса и едва упоминает семантику.

Одна статья, которую я нашел на PHP, - это статья о семантике присваивания. Это очень маленький фрагмент языка и, вероятно, не очень полезен для меня без некоторого контекста. Существует также статья о SaferPHP, которая, вероятно, должна работать с определенным определением PHP, хотя я не мог его увидеть.

Интерпретаторы / компиляторы предоставляют семантику, поэтому я решил взглянуть на них. Тем не менее, источник Zend является пугающим (хотя он предоставляет полезные тестовые случаи), и HipHop работает до 2,7 миллиона LoC. (Мне кажется удивительным, что люди приложили огромные усилия для написания компиляторов для языка, даже не написав что-то вроде спецификации.)

Я думал о том, чтобы взглянуть на системы типов для PHP для руководства, так же, как TypeScript предоставляет некоторые рекомендации для JavaScript. Я нашел эти дразнящие слайды на Hack, необязательной системе типов для PHP. Тем не менее, это всего лишь слайды, и в данный момент проект в Facebook кажется внутренним.

Кто-нибудь знает что-нибудь лучше, чем семантика этих бедняков? Или все просто "учатся на собственном примере"?

5 ответов

Решение

Этот ответ приходит после вашего первоначального вопроса, но теперь у нас наконец есть формальная семантика для PHP. Проверьте это: http://www.phpsemantics.org/. Документ об этом был недавно опубликован в материалах ECOOP 2014. Если вам интересно, вы можете найти ссылку на веб-странице, на которую я ссылался. С уважением.

Кажется, что вы придерживаетесь не официального стандарта (который может быть полезен, например, для того, кто пишет независимую соответствующую реализацию), а для представления языка, который позволит вам понять его логически. К сожалению, такого не может быть, потому что в PHP нет четкой формальной модели. Он вырос органически и в настоящее время обременен несоответствиями, наиболее печально известными по именованию функций и методов, но также и в мелких деталях, таких как то, что считается true а также falseи другие подобные тревожные детали.

Лучшее, что можно сделать, чтобы приблизиться к PHP, на мой взгляд, это получить представление о базовых функциях и библиотеках, об "недочетах", за которыми нужно следить, и (чтобы читать существующий код без отвлечения) для анти-паттернов, которые слишком часто встречаются в реальных PHP-скриптах. Я думаю, что лучше всего изучать PHP под опекой людей, которые знают, как эффективно с ним работать, но у меня не было такой роскоши. (Что касается документации: я потратил целую вечность, прежде чем заметил, что вы можете использовать квадратные скобки для индексации строк. Эта функция может быть упомянута где-то в документации, но не, по крайней мере, тогда, где бы она ни находилась.)

Эта статья дает хороший обзор того, что делает семантическую модель того, что вы хотите, невозможной. (Вы можете пропустить вступительную речь и сразу перейти к обсуждению функций PHP.) Существует множество других похожих текстов. Цитата: "PHP изначально был разработан специально для непрограммистов (и, читая между строк, не для программ); он не очень хорошо избежал своих корней".

Не поймите меня неправильно: я работаю с PHP, и хотя это не мой любимый язык, я бы не сказал, что ненавижу его. Я бы сказал, что для эффективной работы с ним нужно осознавать его природу и ограничения. Если вы приходите к этому из Хаскелла, вас ждет настоящий шок.

Интересный вопрос. Я бы расценил руководство как справочник по официальному языку; Я ценю, что это не совсем "формальная ссылка" в том смысле, в каком вы ищите, но я не знаю, насколько такая вещь была бы широко желаемой, чтобы чему-то научиться.

Я не знаком с PHPWTF, но я предполагаю, что он в той же форме, что и пост в блоге Fractal Of Bad Design (ранее он был связан с @alexis). Я не могу заглянуть в голову ни одному из авторов, но мне кажется, что они написаны с точки зрения желания PHP быть плохим. Религиозные войны часто доминируют в Интернете и в программировании - браузер, который вы предпочитаете, IDE/ редактор, который вы используете, ваша операционная система и выбранный вами фреймворк, имеют одинаково жестокую, партизанскую и непримиримую форму. К сожалению, языки программирования ничем не отличаются.

Это, безусловно, правда, что PHP имеет ряд несоответствий в дизайне, в частности, в отношении того, как обрабатываются значения NULL, и в порядке расположения параметров в стандартных функциях. Тем не менее, это также правда, что PHP был чрезвычайно успешным, несмотря на все это. Он долгое время находился в упадке надёжности в 5.0 и 5.1, 5.2 был стабильным, но, возможно, не корпоративным, и, наконец, он достиг совершеннолетия в 5.3 и далее.

Хотя это может быть моим предубеждением, я чувствую консенсус среди пользователей, которых я читаю в Stack Overflow, что все популярные языки имеют свое место. Отчасти это ответ на то, что те, которые нам не нравятся, не исчезнут, а отчасти возможно, что изучение.net, Java, Perl, Ruby, PHP, Python и т. Д. В значительной степени всегда хорошо. Может быть, мы все вместе устали от огненных войн за каждого (Java раздутый, PHP несовместим, Microsoft - привязка к поставщику, Rails нестабилен и т. Д.).

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

Чтобы решить цель вашего вопроса, как вы должны учиться? Что ж, обучение на примере - это отличный подход - нужно просто знать, какие примеры учить. Поиски "Учебник по PHP" и "Начинающий PHP", возможно, как и в случае с любым другим языком, предложат сочетание отличного и ужасного материала. Можно утверждать, что низкие барьеры PHP для входа привели к появлению большого количества небезопасных и плохо написанных статей "как делать", и я, конечно, видел немало!

Я думаю, что решение состоит в том, чтобы смотреть прямо на код из хорошо спроектированных проектов и учиться там. Такие как:

  • Symfony2 (и компоненты)
  • Zend Framework
  • пропивать
  • приводить в движение
  • доктрина

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


Постскриптум: на другие языки они могут называться под другим именем, но я ожидаю, что у них всех есть переменные функции. В JavaScript, например, это object[myFunc]();, где myFunc это строка

Непосредственно не отвечает на ваш запрос, но объясняет некоторые из магических переменных PHP.

http://webandphp.com/how-php-manages-variables

Это не совсем формальная семантика, но после всех этих лет проект HHVM создал спецификацию PHP!

Другие вопросы по тегам