Python vs PHP: основные отличия
04-05-2023Reading time ~ 13 min.PHP, Python 3101
Самое главное отличие PHP от Python — сфера применения. Python — очень универсальный язык, поэтому его сфера использования намного больше, чем у PHP. Но это не значит, что Python при этом всегда лучше.
PHP создавался только как язык для создания сайтов и лучше него с этим никто не справится. Python тоже можно использовать для создания сайтов, но работать он будет намного медленней. Не говоря уже о том, что сайт на PHP можно разместить на любом дешманском хостинге, а для Python потребуется его хорошенько поискать (и научиться его администрировать).
Сразу определитесь какова ваша цель. Если вы опытный разработчик, то изучение второго языка даст вам дополнительный плюс в профессиональную карму. Языки разные, много отличий, поэтому изучать второй язык будет интересно. Вопрос применения — тут такое — PHP: однозначно для создания сайтов; Python для всего остального.
Если же вы неопытный разработчик, или только думаете какой язык выбрать в качестве первого, то начать лучше с Python, поскольку с ним будет проще понять программирование как таковое. Некоторые сразу делают ошибку — пытаются заранее определить область применения — кому-то интересно тестирование, кому-то работа с данными, а кто-то просто увидел вакансию на Django или Flask.
В этом разрезе правильно будет вначале хорошо изучить именно основы программирования, а уже потом думать о специализации. Здесь есть одна ловушка, в которую легко попасть: в Сети полно видосиков и статеек типа «Как написать свою игру на Python за 30 минут» или «Стоим нейронную сеть за час». Это всё блеф — на самом деле написать хорошую программу на Python точно также сложно, как и на любом другом языке программирования. Но для Python написано множество готовых проектов, которые доступны сразу из коробки. Поэтому игру на 30 минут можно написать только используя готовую библиотеку и скопировав код из её туториала. Тоже самое касается и нейронных сетей, да и вообще всего что обещается на столь короткое время. Но это не программирование — это тупое copy-paste.
Средства запуска программ
Важное отличие PHP от Python в том, что первый всегда требует запуска сервера. Python — это всего лишь текстовый файл с кодом программы и для его запуска достаточно кликнуть мышкой. Но для PHP потребуется «поднять» сервер, даже если это программа типа «hello world». Именно поэтому для работы с PHP нужно понимать устройство http-запросов и знать как вызвать скрипт через браузер.
Справедливости ради стоит отметить, что PHP поставляется со своим встроенным сервером, что приближает его к Python. Но всё равно выполнение программы можно будет увидеть только в браузере. У меня для подобных php-проектов используется bat-файл, который лежит в корне проекта:
start http://localhost:8000/ php -S localhost:8000
Он запускает сервер и браузер по указанному адресу.
Формально в PHP можно использовать «чистую» консоль. Для того, чтобы она автоматом не закрывалась, можно использовать функцию readline()
(это эквивалент пайтоновской input()). Вот пример файла hello.php
:
<?php echo 'hello!'; readline("\nPress Enter to exit...");
Запускать файл следует через командную строку: php hello.php
.
Но, при всех этих возможностях, всё-таки работа PHP строится как работа на сервере, поэтому лучше сразу привыкать использовать вывод через браузер.
Основы программирования
В целом оба языка примерно одинаково позволяют понять основы программирования. Это достаточно большой слой абстракции, которая скрывает реальный код программы.
Например Паскаль (или C) даёт чёткое понимание что такое переменная и как она хранится. Поэтому в Паскале нужно вначале объявить переменную и её тип, а потом уже использовать. В Python и PHP динамическая типизация, поэтому переменные могут быть какими угодно. С одной стороны это удобно для программиста, но с другой не даёт понимания реального устройства переменной.
Если не вдаваться в особенности реализации языка, то PHP в этом плане более удобен для понимания. В нём более строгий синтаксис управляющих конструкций циклов, условий, функций, классов и т.д. Но главное, что синтаксис PHP намного ближе к другим языкам: Java, JavaScript, С, С++ и т.д. Python в этом разрезе использует свой синтаксис, который несовместим с другими языками. При этом сам Python работает на C, поэтому даже странно, что не использует хотя бы часть его основного синтаксиса.
Поэтому если выбрать PHP, то его код будет понятен любому другому программисту, чего не скажешь о Python.
Структуры данных
Что сразу бросается в глаза — это достаточно своеобразное понимание массивов в Python. В PHP есть просто массив, который может быть одномерным, ассоциативным, вложенным. Если нужно создать массив, просто указываем []
и всё.
В Пайтоне намного сложней.
Есть кортеж — неизменяемый (но это не всегда так) массив, который задаётся с помощью круглых скобок ()
, что визуально воспринимается как аргументы функции.
Есть одномерный массив (список), который задаётся через []
. Есть словарь, который ассоциативный массив. Для его задания используются фигурные скобки {}
. А есть ещё множество, которое задаётся как словарь, но состоит только из ключей, что по сути приближает его к обычному одномерному массиву.
При этом каждый вариант имеет свои особенности и тонкости, которые следует учитывать.
Покажу простой пример того, как можно создавать массив из произвольного количества элементов. На PHP:
$arr[] = '1'; $arr[] = '2'; $arr[] = '3'; print_r($arr); /* Array ( [0] => 1 [1] => 2 [2] => 3 ) */
И этот же код на Python:
arr = [] arr.append('1') arr.append('2') arr.append('3') print(arr) # ['1', '2', '3']
Разница в том, что хотя Python такой же динамический язык, как и PHP, но в нём нужно вначале объявить переменную, которая будет содержать пустой список. PHP сразу понимает, что нужно сделать массив и добавить в него указанный элемент.
Дальше работа с массивом в Python происходит уже через методы объекта переменной. То есть в Python нельзя сделать так: arr[] = 1
.
Кажется, разница не принципиальная, но она становится существенной, когда нужно работать с ассоциативным массивом. Пример на PHP:
$Darr['hello'] = '1'; $Darr['world'] = '2'; print_r($Darr); /* Array ( [hello] => 1 [world] => 2 ) */
Здесь мало что изменилось — код простой и интуитивно понятный. Для Python, как нам кажется, следует использовать метод append()
, но на самом деле для словаря его не существует. Вместо этого есть метод update()
, который добавляет в текущий словарь другой словарь. Получается что-то вроде такого:
Darr = {} Darr.update({'hello': 1}) Darr.update({'world': 2}) print(Darr) # {'hello': 1, 'world': 2}
Такой код намного сложнее. Но фишка в том, что для словаря в Python код можно сделать проще:
Darr = {} Darr['hello'] = 1 Darr['world'] = 2 print(Darr) # {'hello': 1, 'world': 2}
Казалось бы всё красиво и элегантно, но почему тогда нельзя использовать такой же способ добавления элемента в список?
Когда же нужно составить сложную структуру из комбинаций ассоциативных, одномерных, да ещё и многократно вложенных друг в друга массивов, то на Python такая задача превращается в ад.
Если в PHP достаточно просто указать вложенность с помощью квадратных скобок, то в Python нужно учитывать где словарь, где список, а для них ещё и разные способы добавления данных, при этом нужно вводить условия для проверки есть ли ключ и нужно ли его добавлять или можно обновить — в общем понять логику такого кода будет не так просто.
Если для вас Python второй язык, то работа с его массивами гарантирует вам множество бессонных ночей. Если же для вас PHP будет языком после Python, то вы будете судорожно пытаться повторить его код, а потом с удивлением узнаете, что оказывается всё можно сделать намного проще и красивей. Мысли об этом, также не дадут вам уснуть.
Объектно-ориентированное программирование
Python позиционируется как ООП-язык, где всё является объектом. Поэтому логично было бы ожидать от него полноценной поддержки ООП, как это принято в Java, С++ или PHP. На самом же деле ООП в Пайтоне это скорее особенности реализации языка, чем следование какой бы то ни было концепции объектного программирования.
Например в Python нет области видимости полей и методов. Жаркие дискуссии в других языках о том, какие методы следует защищать, какие делать приватными, в Python лишены смысла — там просто этого нет — всё публично, всё открыто, делай что хочешь.
Нет привычных статичных классов, методов, нет абстрактных классов, нет интерфейсов в том виде и с таким поведением, как мы привыкли в PHP или Java. Более того, особенности интерпретатора Python позволили родить такие жуткие вещи как «поля объекта» и «поля класса» — это когда можно создать объект, а потом что-то добавить (динамически) в класс, и это что-то будет доступно в объекте. За такое обращение с ООП, помнится, нас били деревянной линейкой по рукам, но в Python пофиг — делай что хочешь.
Поэтому вывод здесь однозначный: изучать ООП на Python можно только по верхам. Примитивное наследования, инкапсуляция, полиморфизм такой же как и в PHP (по сути отсутствующий) и, пожалуй, на этом всё. Паттерны, абстракции, сложные комбинации классов, да и вообще нормальное понимание ООП — добро пожаловать в PHP.
Оформление кода
Особенность Python — использование пробелов для блоков. По началу немного непривычно, потом привыкаешь. Когда переключаешься на PHP, забываешь ставить ;
и сразу не втыкаешь почему компилятор ругается на ошибки.
Положа руку на сердце, можно сказать, что отступ пробелами нисколько не вредит написанию кода, а визуально код выглядит чище и аккуратней, чем в PHP.
Единственная проблема с отступами пробелами в том, что они плохо воспринимаются для большого блока. Например большой цикл или условие и в редакторе не видна строчка начала блока. Визуально понять завершение блока невозможно (особенно если он многоуровневый). В PHP для этого достаточно кликнуть на открывающую кавычку и редактор автоматом подсветит её пару. В Python же подсвечивать нечего, поэтому приходится изголяться и ориентироваться по боковым линям отступов или вообще вручную прогонять курсором с начала до конца блока.
И если случайно перескочил на другой уровень отступа, то приходится долго искать причину ошибки.
Для новичков, где код, как правило короткий, эта проблема не особенно актуальна. Так что в плане оформления кода Python на шаг впереди, поскольку просто не позволяет делать иначе. Для PHP, в общем-то, особой проблемы с оформлением нет, поскольку выполнить автоформатирование элементарно в любом редакторе. Но не все разработчики это делают, поэтому часто код на PHP вместо красоты делают более компактным. Что в итоге и создаёт эффект неряшливости. Хорошо, что на саму работу программы это никак не влияет.
Скорость
Принято считать, что Python жутко медленный. Когда-то подобное говорили и о PHP, но после выхода 7 версии это уже моветон.
На самом же деле скорость - понятие относительное. Если сравнивать работу сайта на MaxSite CMS и Django, то моя система уделает пайтоновкую с полпинка. С другой стороны для сайта на Python нужен отдельный сервер, а значит можно его наворотить так, что он будет работать быстрее андронного коллайдера. Разработчики сайтов с этим постоянно сталкиваются и знают как многое зависит от сервера. Поэтому в таком разрезе сравнивать языки некорректно.
Программы на PHP — это многопользовательские сайты, а программы на Python — как правило для одного пользователя. Например мне нужно было сделать обработку нескольких тысяч текстовых файлов и раньше я писал код на PHP. Скрипт работал несколько секунд. Потом для этого я стал использовать Python и он также работал несколько секунд. По сути всё свелось к скорости работы винчестера и мощности процессора.
Недавно я делал программу на Python, где был сложный обсчёт данных, куча циклов, условий — программа всё равно делает это за доли секунды. Уверен что на PHP это заняло бы примерно столько же.
Поэтому нельзя сказать что Python медленный. Всё зависит от задачи. Для обычного пользователя даже задержка в несколько секунд, например когда запускается сложная библиотека, вроде matplotlib, несущественна.
Если и говорить о тормозах, то это программы на Java. По сравнению с ней что PHP, что Python — реактивные болиды.
Сравнение PHP и Python
PHP — это синтаксис, близкий к другим языкам. С него довольно легко перейти на другой си-подобный язык. С Python всё далеко не так просто: его синтаксис не сложнее, но имеет существенные отличия от других языков.
Удобно, что в PHP для переменных используется особый символ $
. То есть мы никогда не сможем переименовать произвольную функцию, как в Python. Сообщество PHP определилось со способами именования, что опять же делает код более понятным.
Вообще развитие PHP происходит в сторону Java-визации — более строгие правила ООП, возможность строгой области видимости, повальная типизация и т.д. То есть язык развивается и старается избавиться от ошибок прошлого.
Python также активно развивается, хотя разработчики намного более щепетильны к вопросам совместимости. В PHP уже сейчас на всех серверах есть версии 7.x, а также новые 8.x, но в Python до сих пор носятся со второй версией, хотя третья вышла аж в 2008 году. Это примерно как PHP 5.2, о которой уже давно все забыли.
Теперь что касается самого языка.
Обилие «синтаксического сахара» в Python позволяет делать код более компактным. Иногда настолько, что даже теряется его понимание. К тому же Python обладает возможностями, о которых PHP может только мечтать: списковые включения, генераторы, распаковка, возврат нескольких значений из функций, удобные лямбда функции и т.д.
Если сравнивать возможности такого сахара, то Python будет покруче PHP. Есть даже такая книга «Однострочники на Python» — там возможность Python укладывать код в одну строчку продемонстрировано очень хорошо. Короткий код, конечно же, усложняет его понимание, но сама по себе такая возможность впечатляет.
Стоит отметить и то, что многие функции в Python созданы в менее хаотичном порядке. Например в PHP строковые функции могут принимать несколько аргументов, где исходная строка может быть в одном случае первым аргументом, в другом — второй. Или названия функций, то имеют префикс «str», другие «str_», третьи вообще без префикса. В Python — в этом плане всё достаточно строго и упорядочено. По сравнению с ним в PHP — полный бардак.
Так на вскидку: вы помните где в функции strpos()
стог, а где игла?
Сами пользовательские функции очень интересны тем, что можно использовать разные аргументы: именованные, позиционные. Это довольно крутая возможность, которой так не хватает в PHP.
Ещё одна крутая штука Python — это декораторы. Сами по себе декораторы не очень интересны, но отлично помогают упростить код в разных библиотеках. Например в создании чат-бота за счёт декораторов получается компактный и красивый код.
Покажу пример использования Flask, где декораторами прописываются роуты.
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Index Page' @app.route('/hello') def hello(): return 'Hello, World'
На PHP такие вещи сделать просто нереально. В Symfony что-то подобное используется в комментариях, но это совсем не из этой области. Возможности языка просто не позволяют.
Модули
Python универсальный язык, поэтому для него написано огромное количество модулей. Установка через PIP и вуаля! — балуемся сколько хотим. При этом модули хранятся отдельно и не засоряют код проекта.
В PHP также куча модулей, но все они должны оказаться в рабочем проекте. Даже используя Composer получается куча хлама, которое тянется с гитхаба для каждого модуля. Потом это всё нужно загружать на виртуальный сервер, потом как-то обновлять и поддерживать. Это жуткая головная боль.
Сам по себе PHP просто не поддерживает модульность. Всё что сейчас доступно — это некое соглашение о том, как подключать файлы модулей. Но по сути это обычный require()
, поэтому все косяки стороннего модуля оказываются в вашем проекте. Сложность ещё в том, что сторонние модули PHP работают по разному: можно элементарно не угадать в выборе библиотеки, включить её в свой проект, а потом эта библиотека устареет, не будет работать на новых версиях PHP и этот головняк уже ляжет на ваши плечи. В Python с такими вещами намного проще — работа с проектом отделена от работы с модулями.
Вместо заключения
Сообщество PHP разделено на тех, кто готов писать свой «велосипед» ради того, чтобы обеспечить полный контроль над кодом и его ресурсопотреблением, и тех, кто использует уже готовые решения, даже если они громоздкие, часто неудобные и могут требовать дорогого сервера.
Когда-то в PHP преобладала тенденция в написании более простого кода, как и в Python. Но сейчас происходит движуха в сторону многословной Java, поэтому код на PHP жутко раздувается, вводятся куча абстракций, куча файлов, даже если кода в них кот наплакал. С формальной теоретической точки зрения — это может и правильно, но с практической — глупость. В этом плане Python выглядит более симпатичным — здесь компактный код считается преимуществом.
Это важный момент. В Python всё направлено на то, чтобы код был более компактным и практичным. Даже если это выглядит странно и не соответствует классической теории программирования. То есть ставится цель — и нужно её достичь как можно быстрей. Сам по себе PHP позволяет точно такой же подход, но сообщество будет бить вас по лицу за то, что для роутинга вместо супер-пупер библиотеки на 10 Мб используете простенькую функцию, разбирающую глобальную $_SERVER
.
Так что, выбирая PHP, нужно быть готовым к ковырянию чужого кода, часто недокументированного (привет Пайтону с автодокументацией!). Вместо простой библиотеки нужно будет изучать более объёмную и кривую, только потому что у неё больше звёздочек на гитхабе.
Конечно у Пайтона тоже много заморочек, но если не вдаваться в них особо сильно, то Python будет более предпочтительным первым языком. Если совсем-совсем по правильному, то лучший путь — это Pascal (досовский, консольный без углубления за пару недель), потом уже Python. Можно начать сразу с Python, но при этом будет упущено базовое понимание программирования. Я считаю, что если начинать сразу с Пайтона, то лучше это делать с наставником. Курсы, книги, статьи — это шлифованная теория, которая упускает базовые вещи. Наставник может об этом рассказать и обратить внимание на особенности языка.
Наверное стоит ещё отметить, что выбирая Web, нужно сразу ориентироваться на PHP. Но Web это ещё и HTML, CSS и хотя бы простой JavaScript. Даже если вы решите изучить тот же Flask, то он ничего не стоит без HTML/CSS. Поэтому наверное будет проще начать с PHP, подтянуть HTML/CSS и уже потом двигаться в сторону Python и его фреймворков.
Классная статья. Доступно, понятно и красиво разжевано.