カテゴリ: PHP

PHP5.5にリスト記法が実装された!

PHP5.5では

このような書き方ができるようになりました。
でも、配列はわかるけど、「連想配列」だとどうなるだろうと疑問だったのでちょっと試して見ることにしました。

まぁ無理なのはわかってましたが・・エラー・・・。

え・・ということはもしかして・・・

な・・・なるほど・・・

PHPのプログラムデザインを考えてみる

PHPで書くコードは、おもしろいほどぐちゃぐちゃになるんだよね(^_^;)
コードを書くところが の間なので、HTMLのどこにコードを書いても問題がないのがPHP。だから、モジュールをインクルードするところも自由と言ったら自由になってしまう。

それに、Cのようにヘッダファイルというものがないし、Pythonのようにファイル名がそのままクラス名になったりするわけでもないし、インクルードファイルがHTMLでも問題ない。PHPはプログラム言語と言ってしまっていいのかわからないほど、マークアップ言語に限りなく近いベースになっている感じがする。

だからなのか、今までPHPをやってこなかった自分でもどこのPHPの書籍を読んでなくてもすんなりとPHPを書けてしまった。初めてじっくりかいたけど、なんていうか・・・なにかひっかかるものがあった。このもやもやを解決するためにも、Pythonを見習ってPHPでプログラミングするためのプログラムデザインを考えてみようと思います。

「.htaccess」でどのディレクトリのファイルにアクセスしてもindex.phpに飛ばすようにする

PHPは「.php」ファイルに直接アクセスしてその処理をサーバーサイドで表示させますが、ディレクトリのどのphpファイルにも自由にHTTPからアクセスできるようになるのは、セキュリティ上リスクがあるのではないかと考えます。例えば、index.phpからインクルードするための内部だけで使われるPHPファイルがあったとしたら、そのファイルにindex.phpを経由せずともアクセスすることが可能になってしまいます。

.htaccessではこのように書きます。

このようにすれば、index.phpにディレクトリ配下のファイルへのアクセスがあった場合index.phpに飛ばすことが出来ます。ただ、Rewriteを使えるようにするには、Apache側で、モジュールを追加する必要があります。

詳しくが「mod_rewrite.so」で検索するか、下記URLで調べてみるといいです。

http://memorva.jp/memo/linux/mod_rewrite.php

クラスは「classes」フォルダにまとめる

とりあえずどこでもインクルードできるのがPHP。だから気づけばディレクトリがファイルの山で、しかもファイル名が適当で何がなんなのかわからなくなってしまうことを避けるためにも、クラスは「classes」フォルダに纏めることにします。

こんなファイルを作ったら、classesフォルダに「hoge.php」という名前で保存します。

20120512162037

このクラスが使いたくなったら、

として使用します。classesフォルダより前に何か書かなくてもいいの? という場合でも問題はありません。なぜからphpファイルへのアクセスは全て「index.php」を介しているので、カレントディレクトリが変わるようなことはまずありえません。index.phpにアクセス解析を仕込むことも可能になります(笑)

ページは「views」フォルダにまとめる

別に「pages」でもいいと思います。「pages」フォルダを作成したら、そこに作りたいページのファイルを設置します。
20120512163310

しかし、設置しただけでは表示できることができませんので、index.phpを編集します。

これで呼び出せるようになる上にアドレスバーにはちゃんと/welcome/と表示することができます。

「modules」フォルダを作成する

外部からダウンロードしたphpのライブラリや、ひとつの機能だけをもったphpファイルを入れておきます。classesフォルダと分けるのは、他からDLしてきたファイルは必ずファイル名=クラス名となっているわけではないので分ける必要があります。

一つの機能だけを持ったファイルというのは

modules/hoge.php

のようなそんなかんじのものです。

index.phpの先頭には、デバッグ変数やサイトの設定用変数を定義しておく

将来的にサイトを全体的に変更する必要がでてきた場合などに対処するために、index.phpの先頭にはサイトそのものの設定用の変数や言語パックのインクルードなど用意しておきます。

index.php

共有のUIを使用する場合は「ui.php」を用意する。

ブログのように、どのページにアクセスしても同じデザインのページで、本文だけ違うといったサイトをよく見かけると思います。そのように実装する場合は、index.phpにui.phpをインクルードするようにし、「ui.phpのインクルード」 → 「views/xxx.php」というふうにすることで全てのページに共通したuiで表示させることができます。

その他細かい決め事

だいたい重要なことは上に書きましたが、やってはいけないこととして箇条書きにしていきます。

  • index.phpに必要なクラスや関数をまとめてインクルードしない。
  • モジュールとクラスは必ず「views/xxx.php」の先頭でインクルードする。
  • クラスやモジュール内でクラスからグローバルインスタンスを生成しない。
  • ファイル名とクラス名の一致のルールは必ず守る
  • ファイル名と関数名の一致のルールは必ず守る
  • module.phpに関数まとめてしまえなんてことはしない
  • classes.phpにクラスまとめてしまえなんてことはしない
  • config.phpファイルを作ってそこにサイトの情報まとめてindex.phpの先頭にインクルードさせるなんてことはしない
  • upload.phpというファイルが必要になったら、ページ扱いとしてviewsフォルダ内に入れる。
  • ページの中に更にページが必要になるような挙動が必要になる場合は、「views」フォルダ内にフォルダを作成し、「index.php」とそれ以外のファイルを設置するようにする。

PHPに対話モードがあったというお話

Pythonを普段から使っていて、コンソールからPythonを呼び出すとすぐに対話モードになってコードを入力するとすぐに実行できるので、関数の動作確認にものすごく重宝していたのですが、PHPにはこの対話モードなんてないだろうなぁと思っていたのですが、実はあったようです。ただ、Linuxの環境じゃないとできないらしくて、WindowsのDOSだとなぜかうまくいかなかった。いや、あるんだろうけどね。

やりかたは簡単

コンソールを開いて「php -a」とするだけ。こうすればうじゃうじゃコードを書いてすぐ実行なんてことができる。ただPythonと違うのは、ちゃんとセミコロン(;)をつけないと実行されない上に次に書くコードにも影響が及んでエラーになる。ちょっとだけ慣れが必要かなとおもうのですが、PHPは拡張モジュールの実装がめんどくさいので、ちゃんと動くかどうか調べたり、パーミッションがちゃんと有効になってるかとかいろいろとデバッグ的な使い方はできそうですね。

対話型シェルを知らないとぜんぜん開発の効率も変わってくると思います。

対話モードを使うには

対話モードを使うにはPHPをインストールするときに./configureで–with-readlineを指定する必要があります。
また「yum install readline-devel」でreadlineを入れる必要があります。