PHP5.5では
$a = [1,2,3,4];
このような書き方ができるようになりました。
でも、配列はわかるけど、「連想配列」だとどうなるだろうと疑問だったのでちょっと試して見ることにしました。
$a = {a: 1}; $a = {a => 1};
まぁ無理なのはわかってましたが・・エラー・・・。
え・・ということはもしかして・・・
$a = [ a => 1 ];
な・・・なるほど・・・
PHP5.5では
$a = [1,2,3,4];
このような書き方ができるようになりました。
でも、配列はわかるけど、「連想配列」だとどうなるだろうと疑問だったのでちょっと試して見ることにしました。
$a = {a: 1}; $a = {a => 1};
まぁ無理なのはわかってましたが・・エラー・・・。
え・・ということはもしかして・・・
$a = [ a => 1 ];
な・・・なるほど・・・
PHPで書くコードは、おもしろいほどぐちゃぐちゃになるんだよね(^_^;)
コードを書くところが の間なので、HTMLのどこにコードを書いても問題がないのがPHP。だから、モジュールをインクルードするところも自由と言ったら自由になってしまう。
それに、Cのようにヘッダファイルというものがないし、Pythonのようにファイル名がそのままクラス名になったりするわけでもないし、インクルードファイルがHTMLでも問題ない。PHPはプログラム言語と言ってしまっていいのかわからないほど、マークアップ言語に限りなく近いベースになっている感じがする。
だからなのか、今までPHPをやってこなかった自分でもどこのPHPの書籍を読んでなくてもすんなりとPHPを書けてしまった。初めてじっくりかいたけど、なんていうか・・・なにかひっかかるものがあった。このもやもやを解決するためにも、Pythonを見習ってPHPでプログラミングするためのプログラムデザインを考えてみようと思います。
PHPは「.php」ファイルに直接アクセスしてその処理をサーバーサイドで表示させますが、ディレクトリのどのphpファイルにも自由にHTTPからアクセスできるようになるのは、セキュリティ上リスクがあるのではないかと考えます。例えば、index.phpからインクルードするための内部だけで使われるPHPファイルがあったとしたら、そのファイルにindex.phpを経由せずともアクセスすることが可能になってしまいます。
.htaccessではこのように書きます。
#Rewriteを使う RewriteEngine On #ベースのディレクトリ RewriteBase / #アクセスを許可するディレクトリを指定 RewriteCond %{REQUEST_URI} !^/css/(.*) RewriteCond %{REQUEST_URI} !^/js/(.*) RewriteCond %{REQUEST_URI} !^/img/(.*) #全てのアクセスをindex.phpに飛ばす RewriteRule .* index.php
このようにすれば、index.phpにディレクトリ配下のファイルへのアクセスがあった場合index.phpに飛ばすことが出来ます。ただ、Rewriteを使えるようにするには、Apache側で、モジュールを追加する必要があります。
詳しくが「mod_rewrite.so」で検索するか、下記URLで調べてみるといいです。
http://memorva.jp/memo/linux/mod_rewrite.php
とりあえずどこでもインクルードできるのがPHP。だから気づけばディレクトリがファイルの山で、しかもファイル名が適当で何がなんなのかわからなくなってしまうことを避けるためにも、クラスは「classes」フォルダに纏めることにします。
<?php class Hoge { public $hage = 1; public function hoge(){ print($hage -> var); } } ?>
こんなファイルを作ったら、classesフォルダに「hoge.php」という名前で保存します。
このクラスが使いたくなったら、
include("classes/Hoge.php"); $hoge = new Hoge();
として使用します。classesフォルダより前に何か書かなくてもいいの? という場合でも問題はありません。なぜからphpファイルへのアクセスは全て「index.php」を介しているので、カレントディレクトリが変わるようなことはまずありえません。index.phpにアクセス解析を仕込むことも可能になります(笑)
別に「pages」でもいいと思います。「pages」フォルダを作成したら、そこに作りたいページのファイルを設置します。
しかし、設置しただけでは表示できることができませんので、index.phpを編集します。
$url = $_SERVER["REQUEST_URI"]; if (preg_match("/^welcome\/?$/", $url)){ include("views/welcome.php"); } else if (preg_match("/^information\/?$/", $url)){ include("views/information.php"); }
これで呼び出せるようになる上にアドレスバーにはちゃんと/welcome/と表示することができます。
外部からダウンロードしたphpのライブラリや、ひとつの機能だけをもったphpファイルを入れておきます。classesフォルダと分けるのは、他からDLしてきたファイルは必ずファイル名=クラス名となっているわけではないので分ける必要があります。
一つの機能だけを持ったファイルというのは
modules/hoge.php
function hoge() { return "hoge"; }
のようなそんなかんじのものです。
将来的にサイトを全体的に変更する必要がでてきた場合などに対処するために、index.phpの先頭にはサイトそのものの設定用の変数や言語パックのインクルードなど用意しておきます。
index.php
$DEBUG = true; $SITE_TITLE = "Hoge Site"; $SITE_VARTION = "1.00"; include("language.php"); 〜
ブログのように、どのページにアクセスしても同じデザインのページで、本文だけ違うといったサイトをよく見かけると思います。そのように実装する場合は、index.phpにui.phpをインクルードするようにし、「ui.phpのインクルード」 → 「views/xxx.php」というふうにすることで全てのページに共通したuiで表示させることができます。
だいたい重要なことは上に書きましたが、やってはいけないこととして箇条書きにしていきます。
Pythonを普段から使っていて、コンソールからPythonを呼び出すとすぐに対話モードになってコードを入力するとすぐに実行できるので、関数の動作確認にものすごく重宝していたのですが、PHPにはこの対話モードなんてないだろうなぁと思っていたのですが、実はあったようです。ただ、Linuxの環境じゃないとできないらしくて、WindowsのDOSだとなぜかうまくいかなかった。いや、あるんだろうけどね。
コンソールを開いて「php -a」とするだけ。こうすればうじゃうじゃコードを書いてすぐ実行なんてことができる。ただPythonと違うのは、ちゃんとセミコロン(;)をつけないと実行されない上に次に書くコードにも影響が及んでエラーになる。ちょっとだけ慣れが必要かなとおもうのですが、PHPは拡張モジュールの実装がめんどくさいので、ちゃんと動くかどうか調べたり、パーミッションがちゃんと有効になってるかとかいろいろとデバッグ的な使い方はできそうですね。
対話型シェルを知らないとぜんぜん開発の効率も変わってくると思います。
対話モードを使うにはPHPをインストールするときに./configureで–with-readlineを指定する必要があります。
また「yum install readline-devel」でreadlineを入れる必要があります。
GoogleでPHPの正規表現について検索しても直感的に使えるようなサンプルがなかったので書きました。
$hoge = preg_match("/h..e/", "hoge"); print($hoge); //結果:1
$hoge = preg_replace("/h..e/", "hage", "hagehigehugehegehoge"); print($hoge); //結果:hagehagehagehagehage
$hoge = preg_split ("/h..e/", "ahagebhigechugedhegeehogef"); print_r($hoge); //結果:Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )
$hoge = preg_match("/h..e/", "hoge", $m); print($m[0]); //結果:hoge
$hoge = preg_match("/hoge(hage)hige/", "hogehagehige", $m); print($m[1]); //結果:hage
function uploadFile() { $("#form").submit(); //jQuery return false; } window.hoge = []; <form id="form" action="/upload" method="post" enctype="multipart/form-data" target="iframe"> <input name="upload" type="file" onchange="uploadFile();"> </form> <iframe name="iframe"></iframe>
$upload_dir = "/www/var/html/public/"; //ディレクトリはあらかじめ作っておく。Windowsの場合C:\から move_uploaded_file($_FILES['upload']['tmp_name'], $upload_dir . $_FILES['upload']['name']); chmod($upload_dir . $_FILES['upload']['name'], 0666); parent.window.formdata[0] = "<?php print($_FILES['upload']['name']); ?>";
テストはしてないので間違いがあるかもしれません。window.formdataのプロパティとしてグローバル配列変数を作成し、その結果を代入します。ただ、セキュリティの観点からなのかイベントの発火は何度やってもだめでした。親ウィンドウの変数に代入するくらいしかできないようです。
WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !
[crayon lang=”php”] your code [/crayon]