PHPの好きなところ、嫌いなところ
私はPHPを個人運営のWebサービス開発でよく使っています。
元々仕事でJavaをメインに使っていたのですが、PHPを使ってみて、LL言語の手軽さや動的機能の素晴らしさを知り、今ではJavaよりよく使っています。
とはいえ、PHPにも、
- 好きなところ
- 嫌いなところ
があります。それぞれくわしく紹介します。
Contents
好きなところ
環境のセットアップがかんたん
WindowsPCで開発する場合、XAMPPというソフトウェア・パッケージをインストールするだけで、PHP開発に必要なもの一式
- PHPのランタイム
- Apache
- MySQL
が揃います。
サービスが完成してインターネットに公開するのも、レンタルサーバにFTPするだけで動かせます。
この手軽さはとても気に入っています。
VPS上に自分で環境構築するのも、Ruby On Railsに比べればずっとかんたんです。
ですから、Webサービスの環境構築という意味では、開発環境であれ、本番環境であれPHPが一番かんたんだと思います。
ソースコード一つでもWebアプリケーションとして動作する
例えば、以下のようなコードを書いて
<?php echo 'Hello World';
index.phpというファイル名で保存して、レンタルサーバのpublic_htmlディレクトリにFTP送信するだけで、PHPプログラムが動きます。
WebAPIを作るのもかんたんで
<?php $json_response = [ id => 1234, msg => 'Hello', ]; echo json_encode($json_response);
というファイルをapi_sample.phpというファイル名でpublic_htmlに置いて、http://xxxx.com/api_sample.phpというURLにアクセスするだけでJSON APIを呼び出すことができます。
ですから、
- 数ページだけの動的なページを作りたい
- 数個のAPIだけ作りたい
といった「ちょっとしたサーバーサイド開発」の用途でPHPはとても重宝します。
標準関数を呼ぶだけでかんたんにいろいろなことができる
PHPにはものすごくたくさんの標準関数が備わっています。
例えば、PHPから先程のWebAPIを呼び出すなら、
$res = json_decode(file_get_contents('http://xxxx.com/api_sample.php')); echo $res->msg;
これだけで実現できます。
しかも、PHPの技術情報はネット上に豊富なので、
- PHP WebAPI呼び出し
のようにPHP XXXX(知りたいことのキーワード)で検索すれば、すぐに上記のようなサンプルコードとその解説が見つかります。
このようにPHPは導入や学習がかんたんで、とても素晴らしい言語なんですが、嫌いなところもあります。
メソッドやプロパティの動的アクセスがめちゃかんたん
フレームワーク的な機能を開発する場合に、メソッドやプロパティを外部から渡した文字列を使って呼び出したいことがよくあります。
その場合、Javaではリフレクション機能を使ってgetMethodしてinvokeするみたいな少しめんどくさいコードを書かなければなりませんが、PHPの場合、超かんたんで、アロー演算子に変数アクセスするだけで実現できます。
PHPで通常のプロパティアクセス、メソッド呼び出しは以下のとおりです。
//プロパティアクセス $email = $user->email_address; //メソッド呼び出し $user->save();
これを動的に外部から渡した文字列を使って行うと、
//プロパティアクセス $property_name = 'emaii_address'; $email = $user->$property_name; //メソッド呼び出し $method_name = 'save'; $user->$method_name();
これだけでOKなんです。これなら、手軽にフレームワーク的な機能を開発できますね!
嫌いなところ
嫌いなところの大部分は記法の問題です。
変数の頭に$をつけるのが面倒
とても地味なことですが、変数に$をつけるのって意外とめんどいです。
例えば、Rubyでうるう年を判定するコードは以下のように書けます。
def is_leap_year(year) if year < 4 return false end return year % 400 == 0 || (year % 100 != 0 && year % 4 == 0) end
PHPだとこうなります。
function is_leap_year($year) { if ($year < 4) { return false; } return $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0); }
ちょっとした差なんですけど、$って左手の小指でシフトキーを押しながらキーボードの上の方にある$キーを押さなければならないので、アルファベットを打つのに比べて、けっこう面倒です。
このめんどくささが変数の数分積み重なるので、なんとなくコーディング全体の疲れを引き上げる気がします。
それに、構文の冗長さも地味に気になります。
- defとfunctionでは5文字も冗長
- 行末に;(セミコロン)を打たなければいけないのも地味に面倒
です。
比較的最近できた言語(Swift, Go, Scala)は、Rubyと同様に
- 行末に;を打たなくてもいい
- functionではなく、def, funcで関数定義できる
という簡潔な文法になっています。このあたりからも、PHPには構文の古さを感じざるを得ません。
PHPのコードを打ったあと、Rubyのコードを打つとすごく楽にタイプできる感覚がします。
メソッドを$this経由でしか呼び出せない
PHPでプレーンな関数を呼び出す場合、例えばhello関数を呼び出すならば
function hello($name) { return 'Hello ' . $name; } hello('Suzuki'); // ここに注目
と、関数名();で呼び出せますが、クラスの中に定義する関数 = メソッドを呼び出す場合は$this->メソッド名();と書かなければなりません。
class Sample { function hello($name) { return 'Hello ' . $name; } function exec() { $this->hello('Suzuki'); // ここに注目 } }
これまた地味ですが、めんどいです。
初めプレーンな関数で書いていたものをクラスのメソッドに移行した場合には、その関数を呼び出していたコードに$this->を付け足さなければなりません。逆に位内に定義していたメソッドをプレーンな関数に移行したら$this->を除去する手間が発生します。
Javaにもthis.メソッド名()という構文がありますが、this.はあってもなくても動作するので、Javaの方がプログラマーにやさしい文法だと言えます。
このような文法になってしまったのは
- PHPは初め手続き型言語としてスタートして、途中からオブジェクト指向の機能を追加した
- JavaやRubyは初めからオブジェクト指向言語として設計された
といった経緯の違いなのでしょうけれども、PHPユーザーとしては残念な仕様です。
中括弧の位置
ある時、PHPの中括弧はK&R方式で書くのが標準だとPSR(PHP標準を定める規約)で定められました。こんな感じの書き方です。
class Sample { public function sum(&$nums) { if (isset(nums) { $sum = 0; foreach ($nums as $num) { $sum += $num; } return $sum; } return false; } }
- classとfunctionは中括弧の前に改行を入れる
- ifやfor文は中括弧の後に改行を入れる
「いやいや、どっちかにしろよ」ですよね?
しかも、ある時突然、この規約を定めたために、それ以前に書いた中括弧後に改行を入れていたコードは標準じゃないことになってしまいました。
有名なフレームワークでもCakePHP2, Symfony2は中括弧後に改行を入れるスタイルだったのが、次バージョンのCakePHP3, Symfony3では、PSRに従った書き方に変更されています。どんな思いでコーディングスタイルを変えたのだろうと慮れます。
WordPress開発者はPSRを無視して、中括弧後に改行を入れるスタイルを続けています。
class Sample { public function sum(&$nums) { if (isset(nums) { $sum = 0; foreach ($nums as $num) { $sum += $num; } return $sum; } return false; } }
こっちのがスッキリしていて断然いいと思います。
単純な話、中括弧前に改行を入れると行数が増えますからね。スクロールなしで画面に表示できる意味あるコードの行数が少なくなります。
ちょっとした差といえばそうですが、ちょっとした差がコーディング全てに掛かってくるとなると、総数としてはちょっとではないんじゃないかと思います。
それに、ずっと昔に規定したコーディング規約ならばまだしも、JavaScriptがこれだけ流行している状況で、なぜJavaScriptの標準と違う規約をわざわざ設定したのかも理解できません。
PHPもJavaScriptも、function構文は同じです。なのにコーディングスタイルを切り替えなければならないというのは「なんだかなぁ…」という感じです。
↓JavaScriptのfunction
function add(num1, num2) { return num1 + num2; }
↓PHPのfunction
function add($num1, $num2) { return $num1 + $num2; }
違和感ありありです。
PHPプログラマーの多くはJavaScriptのコードも書くはずです。文法の多くが同じこの2つの言語を書く際に関数定義するときだけ中括弧の位置を意識しなければならないのはとても残念です。
まぁ、WordPress開発者のようにPSRを無視すればいいんだけですけどね。
ともあれ、これらは人の趣味・価値観にもよりますし、我慢ならないほど嫌でもありません。それに全てにおいて完璧な言語なんてありえないので、これからもPHPの良い部分を活かせる場面で使っていこうと思います。