Формальная семантика 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.
Это не совсем формальная семантика, но после всех этих лет проект HHVM создал спецификацию PHP!