PHPとPythonはどちらも動的なインタプリタ言語ですが、育ってきた目的が違います。PHPはWebのために作られました。リクエストごとに.phpファイルが実行されてページを出力し、WordPressやLaravelを支えています。Pythonは汎用言語で、Webサイトも動かせますが(Django、Flask)、データサイエンス、スクリプト、機械学習では定番です。WebサイトやWordPressの仕事ならPHPが近道で、それ以外のほとんどではPythonのほうがよく選ばれます。
いちばん手早い比較方法は、同じプログラムを両方で書くことです。まずはPHPの小さなスクリプトで、実行できます。
同じプログラムをPythonで書くと次のようになります。
scores = {"Ada": 92, "Linus": 78, "Grace": 85}
for name, score in scores.items():
grade = "pass" if score >= 80 else "retry"
print(f"{name}: {score} ({grade})")
average = sum(scores.values()) / len(scores)
print(f"Average: {round(average, 1)}")
ロジックはまったく同じです。目に見える違いは文法で、PHPは変数に$を付け、文を;で終え、ブロックに波括弧を使います。Pythonはインデントを使い、記号を付けません。
文法を並べて比較
| 処理 | PHP | Python |
|---|---|---|
| 変数 | $count = 5; | count = 5 |
| 文字列の連結 | "Hi " . $name | "Hi " + name |
| 変数の埋め込み | "Hi $name" | f"Hi {name}" |
| リスト | [1, 2, 3] | [1, 2, 3] |
| キーと値のマップ | ["a" => 1] | {"a": 1} |
| 長さ | count($list), strlen($s) | len(list), len(s) |
| マップのループ | foreach ($m as $k => $v) | for k, v in m.items(): |
| 関数 | function add($a, $b) { return $a + $b; } | def add(a, b): return a + b |
| 無名関数 | fn($x) => $x * 2 | lambda x: x * 2 |
| キーがないときの既定値 | $m["k"] ?? "default" | m.get("k", "default") |
| 厳密な比較 | === | ==(型の自動変換なし) |
配列:PHPは1つの型、Pythonはlistとdict
Pythonはlist、dict、tuple、setを区別します。PHPには配列という1つの型しかなく、順序付きのマップがこれらすべての役割を果たします。キーは整数でも文字列でもよく、追加した順番が保たれます。
Pythonでは2つの異なる型が必要です。
colors = ["red", "green", "blue"]
codes = {"red": "#f00", "blue": "#00f"}
colors.append("yellow")
codes["green"] = "#0f0"
print("blue" in colors)
print("red" in codes)
PHPの型が1つというのは便利ですが、Pythonにはない落とし穴が1つあります。array_filterのような関数は元のキーを保つので、絞り込んだリストに欠番(0, 2, 3)ができることがあります。番号を振り直すには、結果をarray_values()で包みます。
型と型の自動変換
どちらの言語も動的型付けで、どちらも型ヒントを書けます。大きな違いは、型が混ざったときの挙動です。Pythonは文字列と数値の足し算を拒否しますが、PHPは数値の文字列を自動で変換します。
print("10" + 5) # TypeError: can only concatenate str (not "int") to str
print(7 / 2) # 3.5
print(7 // 2) # 3
PHP 8で文字列と数値の比較はずっとまともになりましたが、身につけるべき習慣は同じです。変換させたいのでなければ、PHPでは===を使います。ファイルの先頭にdeclare(strict_types=1);を書くと、PHPは型付きの関数パラメーターに間違ったスカラー型が渡されたときも拒否するようになり、Pythonの型チェッカーの挙動に近づきます。
Web開発
ここが2つの言語でいちばん違うところです。PHPファイルはそのままでWebページです。サーバーに置けば、リクエストのたびに先頭から実行され、フォームのデータはすでに$_GETと$_POSTに入っています。このブロックを実行し、都市名を入力してSendを押すと、$_POSTに値が入った状態でスクリプトがもう一度実行されます。
Pythonで同じページを作るには、フレームワークと起動中のアプリケーションサーバーが必要です。最小限のFlask版は次のとおりです。
from flask import Flask, request
from markupsafe import escape
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def home():
city = request.form.get("city", "").strip()
page = '<form method="post"><input name="city"><button>Send</button></form>'
if city:
page += f"<p>Weather lookup for <strong>{escape(city)}</strong></p>"
return page
どちらのモデルが全般的に優れているということはありません。PHPの「1リクエストにつき1回まっさらな実行」はデプロイが簡単で壊れにくく、クラッシュしても影響は1つのリクエストだけで、メモリはページごとに片付けられます。Pythonの常駐するアプリプロセスは、リクエストの間でメモリに情報を保持でき、WebSocketやバックグラウンド処理に向いていますが、準備に手間がかかります。フルスタックのフレームワーク(PHPのLaravelとSymfony、PythonのDjango)は、結局ルーティング、ORM、テンプレート、認証、キューといった似た機能を備えています。
パフォーマンス
Webページでは、OPcacheを使ったPHP 8は素のコードの実行でたいていCPythonより速く、PHP 8にはJITコンパイラも入っています。実際にはどちらも、リクエスト中の時間の大半をデータベースやほかのサービスの待ちに使うので、この差でプロジェクトが決まることはまれです。Pythonの速度事情は別で、重い数値計算はコアがCで書かれたNumPyやpandasなどのライブラリが担います。インタプリタが遅くてもPythonがデータ分野で主流なのはこのためです。
それぞれが使われている分野
| PHPが強い分野 | Pythonが強い分野 |
|---|---|
| WordPressのサイト、テーマ、プラグイン | データ分析(pandas、Jupyter) |
| LaravelとSymfonyのWebアプリ | 機械学習とAI(PyTorch、scikit-learn) |
| ECサイト:WooCommerce、Magento、Shopware | 自動化とスクリプト |
| 安価なレンタルサーバー、制作会社、フリーランスのサイト | 科学技術計算、教育 |
| サーバーで描画するページとAPI | Django、Flask、FastAPIによるWebバックエンド |
求人市場もこれを反映しています。PHPの仕事はほとんどがWeb開発で、WordPressやLaravelが多めです。Pythonの仕事はWeb、データ、DevOps、MLにまたがるので、数が多くなります。
どちらを先に学ぶか
これから数か月で何を作りたいかで選びましょう。
- Webサイトを作りたい、フリーランスで働きたい、WordPressの仕事をしたい: PHPを学びましょう。すぐにページを公開でき、スキルがそのまま報酬のある仕事につながります。まずはPHPとはと変数から始めてください。
- データ分析、自動化、AIをやりたい、または汎用的な最初の言語がほしい: Pythonを学びましょう。
- モダンなWebアプリを端から端まで作りたい: バックエンドはどちらでもよく、ブラウザ側にはいずれにせよJavaScriptが必要です。PHPとJavaScriptの違いを参照してください。
学んだことの大部分は移せます。ループ、関数、配列とマップ、クラス、例外はどちらでもほぼ同じように動くので、2つ目の言語は数か月ではなく数週間で身につきます。
よくある質問
PHPはPythonより速いですか?
一般的なWebリクエストでは、OPcacheと高速なエンジンのおかげで、PHP 8はたいていCPythonより速く動きます。ただしどちらも十分速いので、応答時間のほとんどはデータベースとネットワークで決まります。数値計算では、PythonはふつうNumPyのようなCで書かれたライブラリに処理を任せます。
PHPとPython、どちらを先に学ぶべきですか?
汎用的なプログラミング、データ分析、自動化、機械学習をやりたいならPythonから。Webサイト、WordPressの仕事、Laravelのアプリが目標ならPHPからです。PHPならほぼどのレンタルサーバーでも動くページを作って公開できます。
Web開発でPythonはPHPの代わりになりますか?
なります。Django、Flask、FastAPIで同じ種類のサイトやAPIを作れます。違いはデプロイとエコシステムです。PHPはほぼすべてのレンタルサーバーで動き、WordPressがあります。PythonのWebアプリは、ふつうプロキシの裏で常駐するアプリサーバーとして動きます。
Pythonの辞書にあたるPHPのものは何ですか?
連想配列です:$user = ['name' => 'Ada', 'age' => 36];と$user['name']。PHPの配列は順序付きのマップなので、同じ型がPythonのlistとdictの両方の役割を果たします。