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も参照

マルチバイト文字列処理 Edit

基本的に、mb_がある関数はそれを使う。たとえシングルバイト文字列しか来ないとわかっていても、必ずmb_を使う癖をつけたほうがよい。

mb_がない関数の場合
preg_関数があるならそれを使う。preg_関数を使う場合、必ず正規表現パターンに/uフラグをつける。

trim, rtrim, ltrimはUTF-8ならおそらく安全。

preg関数のフラグmとsについて Edit

mフラグ

mなしmあり
$文字列の末尾にマッチ行末(改行文字の直前)にマッチ
\Z文字列の末尾にマッチ文字列の末尾にマッチ

sフラグ

sなしsあり
.改行にマッチしない改行にマッチする
[^a]改行にマッチする改行にマッチする

ツール 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 ?>

xdebugのインストール Edit

&color(Red){公式サイトには的確な情報があります。うまくいかない場合は、翻訳サイトを使ってでも公式サイトを読むことをおすすめします。
};

インストールの仕方
1.サーバのphpinfo()のページをブラウザ上でコピーし(HTMLソースをコピーではない)、下記ページにペーストしてボタンを押す。
http://xdebug.org/find-binary.php
するとphpinfoを解析して、正しいインストール方法を教えてくれる。

2.php.iniを編集
; ↓これの書き方はOSによる。上のページが教えてくれるはず。
zend_extension = /usr/lib/php/modules/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_host = 開発環境マシンのIPアドレス
xdebug.remote_port = 9000

※xdebugはただのPHP拡張ではなく、Zend拡張なので
extension = xdebug.so
は間違い。

xdebugリモートデバッグの動作原理 Edit

http://xdebug.org/docs/remote
上記ページで解説されていますが、
1.URLにクエリ文字列XDEBUG_SESSION_START=session_name(session_nameは任意)
が含まれていると、xdebugがxdebug.remote_hostで指定されたマシンのポート9000にアクセス
する。
2.Eclipseなどのデバッガがそのポートで待ちうけ、接続する。
通信プロトコルはDBGpと呼ばれ、仕様も公開されています。

この方法だとxdebug.remote_hostで指定したマシンでしかデバッグできないので、複数人でデバッグできない。その場合はxdebug.remote_connect_backを設定すると、
xdebugが接続してきたIPアドレスを判別し、そこへ接続するようになる(xdebug 2.1から)。

デバッグセッションの有効・無効を切り替える Edit

2011-06-30現在、Firefoxのeasy Xdebugアドオンはうまく動作しないので、ブラウザのブックマークを使うこの方法がおすすめ。
これならIEでも使えるはず。
http://highervisibilitywebsites.com/simple-cross-browser-xdebug-helper-session-starter-and-stopper-no-add-ons-needed

inclued - requireしているファイルの階層を表示する拡張モジュール Edit

CentOSへのインストール方法

yum install php-devel
pecl install channel://pecl.php.net/inclued-0.1.2

/etc/php.iniに

extension = inclued.so
inclued.enabled = On

を追加。

service httpd restart

使い方

$clue = inclued_get_data();
var_dump($clue); 

出力をgraphvizに食わせてグラフを作ることもできる。
http://www.php.net/manual/en/function.inclued-get-data.php

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個やらないで配列やクラスにしてシリアライズするといい。
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

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万行。
セッション変数を全然使っていないので、その辺の参考にはならない。

http://stackoverflow.com/questions/143792/where-to-find-beautiful-php-code-to-read

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/

PHPのカレントディレクトリ Edit

CLIから起動シェルのカレントディレクトリ(*1)
Webから起動アクセスされたPHPファイルのあるディレクトリ

(*1)rubyやpythonをコマンドラインから起動したときも同じ

以下のファイル構成でWebから起動した場合

t/
|- a.php
  sub/
  |- b.php
  |- c.php

a.php

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL & ~E_DEPRECATED);
echo __FILE__ . ":", getcwd(), "<BR>\n";
require("sub/b.php");

sub/b.php

<?php
echo __FILE__ . ":", getcwd(), "<BR>\n";
require("c.php");

sub/c.php

<?php
echo __FILE__ . ":", getcwd(), "<BR>\n";

結果(PHP 5.3.23で確認):

/home/ao/public_html/t/a.php:/home/ao/public_html/t
/home/ao/public_html/t/sub/b.php:/home/ao/public_html/t
/home/ao/public_html/t/sub/c.php:/home/ao/public_html/t

いずれもカレントディレクトリはa.phpのあるtになっている。

require("c.php")をrequire("./c.php")にするとエラーになる(t/./c.phpを探してしまうため)。
require(dirname(__FILE__) . "/c.php")ならOK。

require・includeの書き方 Edit

個人ルールとして、
何回も同じファイルを読み込む可能性がある場合(テンプレートの読み込み等)→include
ライブラリの読み込み等→require_once
を使うようにしている。
include_onceとrequireは使わない。

パス指定は
1.dirnameを使って絶対パスで指定する方式

require_once(dirname(__FILE__) . "/c.php")

2.ディレクトリを指定しない方式

require_once("c.php")

3.相対パスで指定する方式

require_once("./c.php") 

1か2がいいと思う。3は上述のカレントディレクトリの問題によりオススメできない。
2はPEARなどシステムのインクルードパスから読み込むときに使う。



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