画面設計 
二重投稿の防止 
http://shinshu.fm/MHz/23.23/archives/0000011808.html
速習PHP 
・Ruby の p 相当は var_dump(デバッグ用の変数表示)
・
■ == と ===
=== は厳密な比較。通常は == を使う。
詳しくは以下の表を参照。
PHP 型の比較表
http://www.phpoo.net/?p=types.comparisons.html
== の問題点
[PHP-users 32705] 文字列と文字列の比較であっても「==」を使ってはならない
http://ml.php.gr.jp/pipermail/php-users/2007-October/033222.html
http://ml.php.gr.jp/pipermail/php-users/2007-October/033225.html
■ echo と print の使い分け
ささいな違いはあるが、基本的に全部 echo でよい。
http://blog.poyo.jp/archives/id-1199426012
■ require と include
違いは、読み込むファイルが存在しないときのエラーの挙動だけ。
include は Warning だが、require は Fatal Error になる。
よって基本的に全部 require でいい。
require と require_once は明確に使い分けること!
基本は require_once で、明確に何度も読み込みたい場合だけ require を使うのがいいと思う。(処理速度的にも)
↓これは false.php だけが読み込まれる。
<?php
if (1 == 2) {
require("true.php");
}
else {
require("false.php");
}
?>
■ 変数が定義されているか(isset と empty)
変数が定義されているかは isset で判定すること。
empty は空文字列や空配列でも true を返すので、定義の確認には使ってはいけない。
■■■ 配列
PHP では配列と連想配列は同じものである。
つまり
$a = array("hoge", "moge", )
としたとき、$a は配列であり $a[1] でもアクセスできるし、
$a = array("hoge", "moge" => "MMM", "meso");
echo $a[0], "\n";
echo $a["moge"], "\n";
echo $a[1], "\n";
■ 配列のメソッド
配列操作の比較表を参照。
■ キーが存在するか(isset と array_key_exists の使い分け)
変数に null が代入されている場合の挙動が違う。
$a=array("hoge" => null, "xx" => "");
echo isset($a["hoge"]); // => false
echo array_key_exists("hoge", $a); // => true
空文字列が代入されている場合はどちらも true になる
echo isset($a["xxxx"]); // => true
echo array_key_exists("xxxx", $a); // => true
$_GET や $_POST に使う場合は、タイプしやすく読みやすい isset で十分だと思う。
■ セッションを完全に破棄する
// http://www.php.net/manual/ja/function.session-unset.php
session_unset();
session_destroy();
■ 警告を最大限にする
error_reporting(E_ALL);
E_STRICTというのもある。
http://www.php.net/manual/ja/errorfunc.configuration.php
■ エラーログ
error_log
http://www.php.net/manual/ja/function.error-log.php
■ HTMLのフォームから配列をうけとる
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
nameの最後に[]をつけると配列で受け取れる。
http://www.php.net/manual/ja/faq.html.php#faq.html.arrays
Tips 
コマンドラインから対話的に使う 
php -a
php のコンパイル時に readline が有効になっていれば、readline が使える。
しかし有効になっていない場合が多いようである。
無効の場合は
/etc:glb$ php -a
Interactive mode enabled
<?php
echo "mgoemoge";
mgoemoge
のように「<?php」を書かないといけない。
シェルスクリプトで対話環境を実現する iphp
#!/bin/bash
if [ "$1" != "-r" ]; then
if which rlwrap > /dev/null; then
echo "rlwrap mode on"
exec rlwrap "$0" -r
fi
fi
while read -p "> " i; do
php -r "$i;"
echo
done
コマンドライン版で構文チェックや構文ハイライトする 
php -s PHPソースファイルを構文ハイライトしたHTMLを出力
php -l 構文チェック
キャッシュしておく 
http://q.hatena.ne.jp/1201972739
HTMLを生成してサーバ上にファイルとして保存する 
出力バッファリングを使う。
ob_start();
echo "hoge\n";
echo "moge\n";
echo date('Y-m-d H:i:s'."\n");
include('b.php');
$buffer = ob_get_contents();
file_put_contents("var/a.txt", $buffer);
ob_end_clean();
日本語関連 
文字コード/PHPも参照
メールはmb_send_mailでなくmailを使う 
Qdmail + Qdsmtpの使い方 
Qdmail はドキュメントが糞すぎ。
http://www.betatechnology.jp/~ao/files/qdmail.1.2.6b.zip
http://www.betatechnology.jp/~ao/files/qdsmtp.0.2.0a.zip
// Qdmail で SMTP 送信のサンプル
// qdmail.php と qdsmtp.php を同ディレクトリにおいてqdmail.phpをインクルードするだけでもいいらしい
require_once("qdsmtp.php");
require_once("qdmail.php");
$mail =& new Qdmail();
// これはなくても Qdmail は文字コードを自動判定してくれるが、
// 自動判定には誤判定の可能性がなくならないため、明示的に指定したほうが確実
$mail->unitedCharset('UTF-8');
$mail->smtp(true);
$param = array(
'host' => 'XXXXXXXXX.ne.jp',//メールサーバー
'port' => 587 , //これはSMTPAuthの例。認証が必要ないなら 25 でOK。
'from' => 'AAAAAAAA@XXXXXXXXX.ne.jp', // Return-path: になります。
'protocol' => 'SMTP_AUTH', // 認証が必要ないなら、SMTP
'user' =>'AAAAAAAA@XXXXXXXXX.ne.jp', //SMTPサーバーのユーザーID
'pass' => 'PPPPPPP', //SMTPサーバーの認証パスワード
);
$mail->smtpServer($param);
$message="メールの中身をここに書きます。";
$mail->to('BBBBBBBB@CCCCC.com', 'スポック宛');
// 複数宛先指定の場合。 cc, bcc の場合も同じ
//$to = array( 'address1@example.com','address2@example.com','address3@example.com' );
//$toName = array( '宛先1の日本語名','宛先2の日本語名','宛先3の日本語名' );
//$mail->to($to, $toName);
$mail->bcc('alskfjsjf@asd.com');
$mail->subject('メールのテスト');
$mail->text($message);
$ret = $mail->send();
gmailの場合は
'host' => 'tls://smtp.gmail.com',
'port' => 465 ,
マルチバイト文字列置換 
mb_str_replace()は存在しないので自分で作る
↓PHPマニュアルより
function mb_str_replace($needle, $replacement, $haystack)
{
$needle_len = mb_strlen($needle);
$replacement_len = mb_strlen($replacement);
$pos = mb_strpos($haystack, $needle);
while ($pos !== false)
{
$haystack = mb_substr($haystack, 0, $pos) . $replacement
. mb_substr($haystack, $pos + $needle_len);
$pos = mb_strpos($haystack, $needle, $pos + $replacement_len);
}
return $haystack;
}
実験
echo -n $'\xA2\xA1\xA1\xA1' > hoge.txt
でEUC-JPの「◆ 」というファイルを作る。
普通のstr_replaceでは
# このソースはEUC-JPで保存
$str = file_get_contents("hoge.txt");
echo str_replace(' ', 'x', $str);
ひしがたの2バイト目と全角空白の1バイト目がマッチしてしまい、文字化けしてしまう。
mb_str_replaceでは正常に置換できる。
# このソースはEUC-JPで保存
mb_internal_encoding('EUC-JP');
$str = file_get_contents("hoge.txt");
echo mb_str_replace(' ', 'x', $str);
ツール 
タイプミスを検出するクラスライブラリ
http://www.ideamans.com/tool/typo.php
xdebug 
xdebugとは 
デバッグを容易にするためのPHPの拡張モジュール。
機能は
- エラー発生時にスタックトレース表示
PHP標準だとエラーが発生した行の行番号しか表示されないが、xdebugが入っているとその行を呼び出した関数のスタックトレースも表示されるようになる。
- var_dumpに色がついて見やすくなる
- リモートデバッグ(設定が難しい)
もっとも、スタックトレースだけなら xdebug をインストールしなくても debug_backtrace()
と set_error_handler() を使えば同じことができる。
1 <?php
2 if (!extension_loaded(‘Xdebug’)) {
3 set_error_handler(‘my_error_handler’);
4 }
5
6 function my_error_handler($errno, $msg, $file, $line, $context)
7 {
8 switch ($errno) {
9 case E_NOTICE:
10 case E_WARNING:
11 echo “<pre>”;
12 echo “Error in $file:$line
saying:\n\t’$msg’.\n\n”;
13 echo “Local vars:\n”;
14 var_dump($context);
15 echo “\n”;
16 ob_start();
17 debug_print_backtrace();
18 $contents = ob_get_contents();
19 ob_end_clean();
20 echo wordwrap($contents, 100);
21 echo “</pre>”;
22 break;
23 default:
24 break;
25 }
26 }
27
28 function change_dir($dir)
29 {
30 $path = $dir;
31 if ($path{0} != ‘/’) {
32 $path = ‘/’. $path;
33 }
34 chdir($path);
35 }
36
37 change_dir(‘foo123’);
38 ?>
Linuxへインストール 
Vine Linux 4.2 + PHP 5.2.5の場合の記録
基本的に↓と同じ
http://www.trekdevel.net/archives/171
公式のインストールドキュメント
http://xdebug.org/docs/install
apt-get install php5-devel
# tar zxvf xdebug-2.0.3.gz
# cd xdebug-2.0.3
# phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
# ./configure --enable-xdebug
# make
# cp modules/xdebug.so /usr/lib/php5
vi /etc/php5/php.iniで以下を追加
[xdebug]
zend_extension="/usr/lib/php5/xdebug.so"
# php -m
# service apache2 restart
雑多なメモ 
ページ間でのフォームデータの受け渡し 
ページ間でフォームのデータを受け渡すには、1個1個やらないでclassにしてシリアライズするといい。
http://ml.php.gr.jp/pipermail/php-users/2003-June/016138.html
HTML_QuickFormからの脱却 
HTML_QuickFormを嫌う人もいるらしい。
http://news.hotphpper.net/archives/43-HTML_QuickFormea.html
PHPフレームワーク比較 
http://www.phppro.jp/article/framework/comparison.php
http://phpspot.org/blog/archives/2006/03/php_34.html
http://www.ethna.jp/ethna-about-framework_comparison.html
日本ではEthnaが人気高いみたい。ただ、EUC-JP前提(UTF-8対応する方法もあり)。
「ページの有効期限切れ」対策 
http://www.glamenv-septzen.net/pukiwiki/index.php?PHP%2F%A1%D6%A5%DA%A1%BC%A5%B8%A4%CE%CD%AD%B8%FA%B4%FC%B8%C2%C0%DA%A4%EC%A1%D7%C2%D0%BA%F6
PHPでcronもどき 
pseudo-cron.php
http://hp.vector.co.jp/authors/VA035840/sd_php.htm
PHPとsendmailで任意のメールアドレスに来たメールを処理する方法 
check*padではリストごとにxxxxxxxxxxxxxxxx@checkpad.jpるアドレスを発行し、そこにメールを送ると本文を解析してTo Do項目を追加してくれます。このように@checkpad.jp以前が可変の場合、どのように処理するかの説明です。
http://www.ideaxidea.com/archives/2008/01/phpsendmail.html
PHPからCOMを呼べる 
http://ml.php.gr.jp/pipermail/php-users/2003-February/013604.html
PHPで書かれた参考になるオープンソースソフト 
OpenPNE mixiのパクリ
かなり綺麗。ライブラリ部分とアプリケーション部分の分離がみごと。webapp以下約6万行。
解説がこちらにある:http://www.openpne.jp/docs/pne-training-4
WordPress
綺麗だが、アプリケーションとして小規模。約5万行。
セッション変数を全然使っていないので、その辺の参考にはならない。
PHPの実行をPHPのソースコード(C言語)のレベルで見る方法 
http://d.hatena.ne.jp/suztomo/20080605/1212687962
PHPでRuby風の配列操作をするライブラリ fluent 
http://www.prodevtips.com/2008/06/23/fluent-arrays-and-strings-in-php/