解説
今回のプログラムは、PHPの中でも最も基本的な要素を組み合わせて作れるプログラムです。とはいえ、今の段階ではこのプログラムも内容を理解するのは難しいかもしれませんので、まずはもっともっと基本的なプログラムから始めていきましょう。新しいファイル(sample01.php)を作って先と同じ「recipe01」フォルダに保存し、次のように記述してみましょう。
<?php print('printファンクションは画面に文字を表示します'); ?>
このファイルを、Webサーバーにアップロードしてアクセスしてみましょう(http://localhost:8888/recipe01/sample01.php)。次のように表示されます。(文章が正しく表示されない場合は、文字コードなどが間違えている場合があります。設定を確認しましょう)
printファンクションを動作させたところ。画面はエディタソフト「Coda」で表示しています
PHPのルール
本連載は、HTMLや CSSはすでに知っている方を対象としていますので、HTMLと対比して紹介しましょう。HTMLの場合、「HTMLタグ」というもので要素を囲む(マークアップする)ことでさまざまな意味づけや装飾を行うことができるマークアップ言語です。その書き方にはいくつかのルールがあるのことは、ご存じでしょう。例えば……
- 属性の前後はダブルクオーテーション(")で囲む
- 開きタグと閉じタグをセットで使う
- ddタグはdlタグの子要素として使う
PHPも同様に、その書き方には次のようなルールがあります。
・プログラムの前後は、「<?php」と「?>」で囲む
・行の終わりには「セミコロン(;)」を打ち込む
・ファイルの拡張子を .phpとする
というルールです。これを守らないと、PHPはうまく動作しなくなってしまいます。
先ほど作ったプログラムの中には「ルールに従うため」に記述した部分もあるため、それらを取り除くと次のようになります。
print('printファンクションは画面に文字を表示します')これが、今回のプログラムの本体となります。
やりたいこと=ファンクション
PHPのプログラムは、最初に「やりたいこと」を記述します。ここでは「print」という記述がやりたいことで、これは「画面に文字を表示する」という機能を表しています。この機能のことを「ファンクション(function)」または日本語で「関数」などと呼び、たくさんの種類があります。書店で売られているPHPの辞典などを見ることで調べることができ、これを数多く覚えることで英語の「単語」と同様に会話の幅が広がる(=プログラムの幅が広がる)のです。
ファンクションは、インターネット上でも調べることができます。次のサイトを見てみましょう。
これはPHPのオフィシャルサイトに掲載されている「リファレンス」です。文章は非常に読みにくい翻訳の文章ですが、見慣れれば参考になります。一覧を見ると、たくさんの種類がある事が分かるでしょう。
本連載でもさまざまなファンクションを紹介していきます。冒頭の「材料」という部分にその回で使うものが分かるので、少しずつ覚えていきましょう。
やりたいことの補足 = パラメーター
ファンクションは、後に必ずカッコが続きます。print(…このカッコの中には、「パラメーター」を記述するルールになっています。パラメーター(Parameter)とは英語で「範囲」とか「制限」などと訳されますが、ゲームなどでキャラクターの強さを調整する時に「パラメーターを調整する」などと言うことで分かるとおり、設定の内容などを細かく調整することです。
例えば、今使っている「print」というファンクションには「画面に文字を表示する」という機能はあるものの、実際になにを表示するかは今の時点では分かりません。そこで、それを補足するためにパラメーターで次のように指定した訳です。
print('printファンクションは画面に文字を表示します');パラメーターに「文字」を入れる場合は、それをコンピュータに理解させるために、その両端を「シングルクオーテーション(')」で囲む必要があります。なぜなのかは、この後紹介します。
これで、「画面に文字を表示する」というプログラムは作れるようになりました。パラメーターの内容をいろいろ変化させて、試してみましょう。
日時を知るためのファンクション - date
続いて、別のファンクションを見てみましょう。「date」というファンクションは、その名の通り「日時を知る」という意味を持ちます。オフィシャルドキュメントは次のページにあります。パラメータには「日付の書式」を指定することができます。この書式の指定は、かなり特殊です。例えば、次のように指定すると今年の「年」を知ることができます。
date('Y');※このプログラムは不完全なので動作しません。
この「大文字アルファベットの Y」という文字が「年を知りたい」という意味のパラメータになります。先のオフィシャルドキュメントを見てみましょう。下に表がずらっと並んでいます。
このアルファベットを組み合わせることで、さまざまなフォーマットで日時や曜日などを知ることができるのです。ここでは、小文字の n(=月を 1桁または 2桁で)と、小文字の j(=日を 1桁または 2桁で)という記号を使って、次のような書式を取り出します。
1月 23日この時、アルファベット以外の文字を記述するとそのまま残ってくれるので、パラメータは次のようになります。
date('n月 j日');これで、今日がもしも 5/1だったら
5月 1日となります。
機能が不完全なファンクション
さて、非常に便利な dateファンクションですが、実は機能がちょっと不完全です。例えば、次のようにプログラムを作ってみます。今日は、<?php date('n月 j日'); ?>です。しかし、これは正常には動作しません。このままでは、画面に日付が表示されないのです。
「date」というファンクションの役割は、「日付などを知る」という事だけです。今回、私たちがやりたい「画面に今日の日付を表示する」という事には、「date」ファンクションだけでは足りないのです。
このような事は、プログラム言語の世界には良くあります。そこで、複数のファンクションを組み合わせて、希望する動きに近づけていく事が必要になります。
これこそが、「プログラマー」と呼ばれる人たちの役割。プログラマーは、多くのファンクションの使い方を覚えて、それらを効率よく組み合わせて大規模なプログラムを作り上げていく訳です。
ここでは、先ほど覚えた「print」ファンクションと組み合わせて、「今日の日付を画面に表示する」というプログラムに仕上げていきましょう。
ファンクションの入れ子
まず、printはそのパラメーターに、「表示する文章」を指定することができました。print()そこで、このカッコの中に「今日の日付を知る」というdateファンクションを入れ込んでしまいます。
print(date('n月 j日'));ちょっと見た目が複雑ですが、このようにファンクション同士は入れ子にすることができます。HTMLに似てますね。
こうすることで、dateファンクションで知ることができた「今日の日付」を、今度はprintファンクションが「画面に表示」をするという連携作業で、機能を実現する事ができたという訳です。
さらに、dateファンクションにはもう1つ「date_default_timezone_set」ファンクションも組み合わせる必要があります。 これは、日付を知るために必要な「タイムゾーン」を指定するためのもので、日本国内で利用する場合は「Asia/Tokyo」をセットします。もしこの連載を、日本国外でご覧の方は、自分の地域に合わせましょう。これを「date」ファンクションよりも、前に記述します。
date_default_timezone_set('Asia/Tokyo'); print(date('n月 j日'));これで、プログラムの完成です。今日の日付が表示されるようになりました。
printにクオーテーションがない訳
ここで、先ほど「printのパラメーターにはシングルクオーテーションが必要」と紹介しました。しかし、このプログラムにはそれがありません。しかし、これは正しいプログラムです。例えば、ここにルール通りクオーテーション記号を加えてみましょう。print('date(\'n月 j日\')');※単純に加えただけでは正しく動作しなくなるため、少し変更を加えています
このプログラムを動作させると、画面には次のように表示されていまいます。
printにシングルクオーテーションを足すと、そのまま表示されてしまった
print('1+2');このプログラムを動作させると、画面には「1+2」と表示されます。では、次のようにシングルクオーテーションを外してみます。
print(1+2);この場合、画面には「3」と表示されます。1+2の計算結果が表示されている訳です。
シングルクオーテーションをつけた場合はそのまま、つけない場合はその内容をPHPが理解して表示するようになります。つまり、dateファンクションを行った結果、知ることができた今日の日付をprintファンクションで表示したというわけです。
難しくて楽しい世界 PHP
PHPは、「理解」をしようとすると非常に難しいものです。それは、例えば英会話を勉強しようとしたときに、文法の細かいルールや、ニュアンスの違いなどを理解しようとすることに似ています。また、料理で言えば各栄養素の名前や役割を理解しようとしているのと同じです。知っておいて損はないですが、実際の英会話や料理では多少の知識さえあれば、十分実践に役立てることができます。
この連載では、もちろん知識も少しずつ紹介していきますが、全部が理解できる必要はありません。それよりも、覚えたファンクションをどんどん使って、少しずつ体に浸透させていくことを心がけましょう。
この連載で、さまざまな「レシピ」を紹介するのでクッキングを楽しむように、プログラムの世界を楽しんでみてください。