クラス内での自分の呼び方

2008/06/20 | PHPの基本

自分でプログラムを作るときは、基本的にはフレームワークでの構築になるので、classを記述して、objectを生成し、そこからメンバ関数にアクセスすることがほとんどだ。だからclassの中のメンバ関数から、他のメンバ関数を呼び出すときは以下のような記述になる。

$this->hoge()
$thisはいうまでもなくオブジェクトそのものを意味する。

ところが、稀にオブジェクトを生成せずに直接class内のメンバ関数にアクセスして使うような記述をすることもある。極力内容には心がけているのだが、簡単な関数を作成したりする場合に、同じ名前空間(クラス名)の中に類似関数(メンバ関数)をとりまとめておいたりするために、やはりclassを使用する。

このとき、同じclass内の別の関数へのアクセスの記述方法がわからなかった(というかべた書きしていた)。例えば、

class hoge
{
  fuga(){}
  piyo(){}
}

みたいなclassがあるとして、メンバ関数piyoをhoge::piyo()みたいに呼び出して使用するわけだが、piyo関数でfuga関数を呼びたいときにどうすればよいのか、それがわからなかった。今まではクラス名をそのまま使って以下のように記述していた。

hoge::fuga()

ただこれだと、命名規則等の関係でクラス名を変更してしまったら動かなくなることは自明だ。どうやって書いておくべきなんだろう、と思ってはいたけれど、必要性にも迫られなかったので(というかその都度修正したりしていたので)放置していたが、今日やっとわかった(たまたま見つけた)。正解は、

self::fuga()

でした。いわれてみれば、「parent::fuga()みたいな書き方するよな」と思うのだが、どうやらselfは完全に見過ごしていたらしい。

ちょっと恥ずかしいが勉強になった次第。

SSL、ダウンロード、session・・・

2008/06/05 | PHPの基本

とある案件でSSLを使用した。SSL環境下で、PHPを使ったファイルのダウンロードに関しては注意すべき点がある(以前PDF出力のところで少し触れた)。IEには潜在的にバグがあって、PHPを使ったSSL環境下でのファイルダウンロードがうまくできないことがあるのだ。特にセッションを使っている場合は注意が必要で、session_start関数を呼び出す前に、やっておかないといけないことがある。

session_cache_limiter(‘public’);
session_start();

上記のように一つ関数をかませるか、ダウンロード時に以下のようにヘッダを出力してやる。

header(“Cache-Control: public”);
header(“Pragma: public”);

多分、これで大丈夫。IE7でも治ってなかった。きっとMicrosoftいわく「バグじゃねえよ、仕様だよ」ってことなんだろうな。

最近のphpMyAdminの設置

2008/06/04 | PHPの基本

MySQLデータベースを操作するためのツールは、現状デファクトスタンダードといってもいいのがphpMyAdmin。現時点での最新バージョンは2.11.6だ。最近は備え付けのところが多いのだが、いざ自分で設置するとなると、昔のバージョンとは少し設定方法が違ってたりしてとまどうことがある。今回設置の際にドキュメントを少し読んだので設置方法をメモしておく。

(1)ファイルをダウンロードして解凍
(2)config.sample.inc.phpをconfig.inc.phpにリネームして編集
(3)編集した箇所はここ
 17行目付近(ここに適当な文字列20文字くらいを入れる)
 $cfg[‘blowfish_secret’] = ”
 28行目付近(接続用のIDとパスワードを入れる)
 $cfg[‘Servers’][$i][‘user’]= ‘root';
 $cfg[‘Servers’][$i][‘password’]= ‘cbb74bc';

上記でOK。これでパスワードを都度聞かれることはない。userとpasswordを設定しなければアクセスした際に入力を求められるので有効なuser/passwordを入力すればよい。

ちなみに専用サーバなどではたいていrootの初期パスワードがブランクに設定されているので、何も設定しなくてもアップロードするだけで使えるようになってしまう。セキュリティに配慮するために、rootパスワードを設定しておいたほうがいいだろう。もちろん上記のようにuser/passwordを指定するなら、別の認証を加える必要があることは言うまでもないことだけど。

mail関数とエラーメール

2008/06/03 | PHPの基本

PHPからはmail関数やmb_send_mail関数を使えば、簡単にメールを送信することができる。しかし、そもそもこれらの関数だけで、RFCに沿った日本語メールを送信することはできない(らしい)。「RFCに厳密に沿って」作るのが一番いいのは間違いないが面倒なので、mb_send_mail関数を使う際のオプション類についてメモしておく。
mb_send_mail関数は標準で引数3つ、オプションであと2つの引数、合計5つの引数をとることができる。標準の3つの引数はメール送信時には必須の「宛先メールアドレス」「タイトル」「本文」。残りの2つのオプションが重要だ。

第4引数:メールの追加ヘッダ
ここで指定した文字列をメールのヘッダとして追加してくれる。標準の3つの引数だけでメールを送信すると、到着メールの送信者欄が「apache@example.net」みたいになってしまうので、以下のように設定すればよい(行末は改行で複数行のヘッダを指定できる)。
“From: hoge@example.net¥r¥n”

第5引数:MTAへのオプション指定
上記で送信者メールアドレスを指定することはできる。しかし宛先メールアドレスが間違っているなどの場合には、残念ながら上記で設定したFromメールアドレスにエラーメールは返ってこない。エラーメールはFromヘッダには返されないことがほとんどなのだ。ではどういったヘッダを加えるかということになるが、メールソフトなどで受信したメールのヘッダを覗いてみるといい。Return-Pathというヘッダがあるはずだ。実はこのヘッダのメールアドレス宛にエラーメールが返されている(ようだ)。では「Return-Pathを第4引数に」と思うのだが、実は早計で、Return-Pathは特別なヘッダなのだ。
では、どうするか。それを解決するのが第5引数だ。第5引数に以下のように与えればよい。
“-f hoge@example.net”
第5引数はMTA(メールサーバソフト)に、メール送信時のオプション指定をするためのもので、そこで指定するのが正しい。これでエラーメールが届く(確率が上がる)。

実はエラーメールの配送は、自分のサーバや相手先サーバの使用に依存することが多いので上記の設定でもエラーを拾うことができない場合が多々あると思われる。そんな場合は・・・都度原因を追うしかないだろうな。

構文記述方法のことで

2008/05/27 | PHPの基本

PHPで画面出力部分を取り扱う場合はテンプレートエンジンを使うことが多いのだが、管理者向け画面などは凝ったデザインの必要がないので、PHP直書きで記述することも多い(直書きであってもテンプレートとして別ファイルにしているが)。そういった場合での、テンプレート内に制御構造を記述する際のメモ。

「テンプレートエンジンと使わない」といっても、何でもかんでもプログラム本体と同様にprint()とか書いていると当然読みにくくなるので、省略形などを使う。例えば、

「<?php print($str); ?>」のかわりに「<?=$str ?>」とか。

あと制御構造も、

<?php
if($condition){
  print(‘hoge’);
}else{
  print(‘fuga’);
}
?>

などと書くとやっぱりわかりづらいので、以下のように記述している。

<?php if($condition): ?>
hoge
<?php else: ?>
fuga
<?php endif; ?>

でも上記のように制御構造を記述する場合、if節の中にif節という具合に入れ子にできないのが難点だ。だって、どの「endif」がどれに対応しているのかわからなくなるから。

これって回避方法はあるんだろうか。マニュアルを見ても書いてなさそうだったんだよね。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net