Top > PHP

画面設計 Edit

二重投稿の防止 Edit

http://shinshu.fm/MHz/23.23/archives/0000011808.html

速習PHP Edit

・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 Edit

コマンドラインから対話的に使う Edit

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

コマンドライン版で構文チェックや構文ハイライトする Edit

php -s   PHPソースファイルを構文ハイライトしたHTMLを出力
php -l   構文チェック

キャッシュしておく Edit

http://q.hatena.ne.jp/1201972739

HTMLを生成してサーバ上にファイルとして保存する Edit

出力バッファリングを使う。

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();

日本語関連 Edit

文字コード/PHPも参照

メールはmb_send_mailでなくmailを使う Edit

Qdmail + Qdsmtpの使い方 Edit

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 ,

マルチバイト文字列置換 Edit

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);

ツール Edit

タイプミスを検出するクラスライブラリ
http://www.ideamans.com/tool/typo.php

xdebug Edit

xdebugとは Edit

デバッグを容易にするための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へインストール Edit

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

雑多なメモ Edit

ページ間でのフォームデータの受け渡し Edit

ページ間でフォームのデータを受け渡すには、1個1個やらないでclassにしてシリアライズするといい。
http://ml.php.gr.jp/pipermail/php-users/2003-June/016138.html

HTML_QuickFormからの脱却 Edit

HTML_QuickFormを嫌う人もいるらしい。
http://news.hotphpper.net/archives/43-HTML_QuickFormea.html

PHPフレームワーク比較 Edit

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対応する方法もあり)。

「ページの有効期限切れ」対策 Edit

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もどき Edit

pseudo-cron.php
http://hp.vector.co.jp/authors/VA035840/sd_php.htm

PHPとsendmailで任意のメールアドレスに来たメールを処理する方法 Edit

check*padではリストごとにxxxxxxxxxxxxxxxx@checkpad.jpるアドレスを発行し、そこにメールを送ると本文を解析してTo Do項目を追加してくれます。このように@checkpad.jp以前が可変の場合、どのように処理するかの説明です。

http://www.ideaxidea.com/archives/2008/01/phpsendmail.html

PHPからCOMを呼べる Edit

http://ml.php.gr.jp/pipermail/php-users/2003-February/013604.html

PHPで書かれた参考になるオープンソースソフト Edit

OpenPNE mixiのパクリ
かなり綺麗。ライブラリ部分とアプリケーション部分の分離がみごと。webapp以下約6万行。
解説がこちらにある:http://www.openpne.jp/docs/pne-training-4
WordPress
綺麗だが、アプリケーションとして小規模。約5万行。
セッション変数を全然使っていないので、その辺の参考にはならない。

PHPの実行をPHPのソースコード(C言語)のレベルで見る方法 Edit

http://d.hatena.ne.jp/suztomo/20080605/1212687962

PHPでRuby風の配列操作をするライブラリ fluent Edit

http://www.prodevtips.com/2008/06/23/fluent-arrays-and-strings-in-php/



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: (41d)