CodeIgniterとCakePHP

PHPフレームワークは数多あれど、作りたいアプリの規模やら好みやらを考慮した結果、今回はCodeIgniterかCakePHPを使いたいなと思いました。
CodeIgniterは触ったことがあるのですが、CakePHPは触ったことがないので、少し両者を比較したサイトを眺めて見ることに。
その際に面白かったサイトを、いくつかご紹介。


cakePHP と CodeIgniter を使い比べてみる
 http://760.jugem.jp/?eid=249
CodeIgniterから再びcakePHPに戻す。その理由。
 http://d.hatena.ne.jp/nantekkotai/20081005/1223218777

PHPの関数をJSで実装したphp.js

php.js
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_numeric/

phpの関数をjsで実装しているようです。
現在、その数285 !!
言語が違うので、まったく同じ挙動、機能、結果というのは難しいでしょうが、面白そうですねー。

ということで、チョットだけ。

DocTestを使ってみる 2day-テスト実行-

続き。
以下のスクリプトをString.phpとして保存します。

<?
class String{
	/**
	* 文字列であればtrue
	*
	* #test
	*
	* #文字列です(#f("こんにちは"));
	* #false(#f(123456));
	* #文字列です(#f("12345"));
	* #文字列です(#f(""));
	* #false(#f(123.456));
	*
	*
	* @param integer $value テストする値
	* @access public
	*/
	public function validate($value){
		if (is_string($value)) {
			return "文字列です";
		} else {
			return false;
		}
	}
}
?>

実行はcmdから。


C:\xampp\htdocs\DocTest>php doctest.php classes
PHPUnit 3.3.9 by Sebastian Bergmann.

.

Time: 0 seconds

OK (1 test, 2 assertions)

できました。おもしろーい。
個人的には、PHPUnitよりとっつき易くて好きでした。

DocTestを使ってみる 1day-インストール-

PHPUnit3があんまり好きな感じじゃなかったので、DocTestを使ってみることに。

Apache 2.2.11
MySQL 5.1.30
PHP 5.2.8
・ PHPUnit3.9.9

が入っています。PHPUnit3のインストールについては、以前の記事をご参照下さい。

まず、どこでもいいので、下記のディレクトリとファイルを作成します。

DocTest
 -classes(Dir)
   -__BASEDIR__(File)
 -tests_c(Dir)
   -__BASEDIR__(File)

phpUnit3は既に入っているので、次にMaple4_DocTestをインストールします。

次にdoctest.phpとして、以下を記述したファイルを作成します。

<?
require_once 'Maple4/DocTest.php';

if (isset($argv[1]) && realpath($argv[1])) {
	$pathname = realpath($argv[1]);
} else {
	echo "Usage: php doctest.php [dirname or filename]\n";
	exit;
}

$options = array(
	 'compileDir' => dirname(__FILE__) . '/tests_c'
	,'color' => false
	,'report' => null
	,'forceCompile' => true
	,'notify' => null
);

Maple4_DocTest::create()->run($pathname, $options);
?>

=>http://www.phppro.jp/school/test/vol7/1より

これはDocTest呼びだし用のスクリプトなので、実際にテストしたいクラスと、DocTestで行いたいテスト内容を記述します。

PHPUnit3を使ってみる 2day-作成と実行-

とりあえず動かしてみたいので、単純なスクリプトを書いて、テストを実行してみます。

OutputTest.php

<?
require_once 'PHPUnit/Extensions/OutputTestCase.php';

class OutputTest extends PHPUnit_Extensions_OutputTestCase{
  public function testExpectFooActualFoo(){
    $this->expectOutputString('foo');
    print 'foo';
  }

  public function testExpectFooActualBar(){
    $this->expectOutputString('foo');
    print 'bar';
  }
}
?>

ファイル名とクラスを一致させます。
メソッドはtestから始まっていなければなりません。(別の方法もある)
publicでなければなりません。

今回は出力が期待通りのものか調べます。
PHPUnit_Extensions_OutputTestCaseをextendsしたクラスを作成して、メソッドexpectOutputString(string $expectedString)を使用します。
他のメソッドは以下。

・・・・・・・・・・・・・・・・・・・・
void expectOutputString(string $expectedString)
出力が文字列 $expectedString と等しくなるであろうという予測を設定します。

void expectOutputRegex(string $regularExpression)
出力が正規表現 $regularExpression にマッチするであろうという予測を設定します
・・・・・・・・・・・・・・・・・・・・

実行。
現在の環境はwindowsなので、cmdで以下を入力してEnter。

C:\>phpunit OutputTest

で、実行結果はこうなります。

1行目は著作権表示です。Sebastian Bergmannさん、ありがとうございます!
2行目が実行結果です。ひとつの.(ピリオド)がテスト成功を表し、Fがテスト失敗です。
Eがエラー、Sがスキップです。

expected string
difference
got string
のdifferenceで、どこが違うか教えてくれます。

<?
public function testExpectFooActualBar(){
  $this->expectOutputString('foo');
  print 'for';
}
?>

としたなら、
expected string
difference < x>
got string

となります。すてき。

PHPUnit3を使ってみる 1day-インストール-

PHPUnit3を使ってみたいと思います。
PHPUnit3は、PHPのUNITテストツールです。詳細を知りたい場合はググッてくださいね。

ますはインストールです。
取り敢えず、XAMPPを使用して、以下の環境を構築。
Apache 2.2.11
MySQL 5.1.30
PHP 5.2.8

pear channel-discover pear.phpunit.de
として、channelを登録。
PEARでの管理から開発者のサイトでの管理に移ったみたい。

すると、ディレクトリへの書き込み権限エラー。
PEARの設定がデフォルトだとおかしくなっているようで、参照すべきディレクトリを参照できていないよう。
なのでgo-pear.batを叩いて設定変更、確認。

go-pear.batを叩いてインストール完了した後、ついでにpear_infoをインストールしておく。

pear install pear_info
次に、本命のPHPUnit3をインストールしていく。
デフォルトでPHPUnitとPHPUnit2がインストールされているので、PHPUnitをrenameしておくと良い。
その後、再度チャンネルを登録。
pear channel-discover pear.phpunit.de
インストール。-aオプションはお好みで。
pear install -a phpunit/PHPUnit
ダーッとインストールされたらOKです。
phpunit --hで、コマンドが有効になっているか確認しておきましょう。
ちなみに、私がインストールしたのは、3.9.9でした。

PHP6の新機能 Unicodeへの対応

現在PHPでは、unicodeはネイティブにサポートされてはおらず、mbstringエクステンションを使用して対応していました。
PHP6からは、ネイティブにunicodeがサポートされるようですね。
ということで、unicodeサポートについて調べてみることに

お金に余裕があるなら、確実に本物を買いたいときは、直営店が一番手っ取り早いので、まずは下記を調査します。
README.UNICODE

じゃあ、抜粋して要約…ていうか主観的意訳ですので、正確な情報は、ご自分で読んで理解してくださいね。。
文頭が「☆」なものは、横槍や補足です。

                                                                        • -

導入

                                                                        • -

mbstringが、より簡単なマルチバイトデータ処理を可能にしましたが、PHPはネイティブにユニコードをサポートをしていません。
時代の流れには逆らえないので、ICUというライブラリを使用して、unicodeをサポートすることにしました。

                                                                        • -

全体的な注意点

                                                                        • -

この国際化機能は、主に「ICU (International Components for Unicode)」ライブラリを利用して実装されています。
ICUは、IBMが提供するUnicodeと国際化処理のためのC/C++Java向けライブラリで、オープンソースライセンスの下で配布されています。
以下のような機能があります。
エンコーディングの変換
文字列照合
Unicodeテキストの処理
その他たくさん
http://www.phppro.jp/phpmanual/php/ref.unicode.html

PHP6をビルドすると、unicodeサポートは使用できるようになっています。

    • with-icu-dir=<dir>

このように、ICUのライブラリの場所を指定してください。

ちなみに、ICUはPHP6にはまだバンドルされていないので、DLしてくる必要があります。
ICUはVer.3.4以降のものが必要。

                                                                        • -

以前のバージョンとの互換性

                                                                        • -

互換性はすごく大事なので維持しようとしていますが、特定の処理において、処理速度には何らかの影響がでるかも。。
☆詳しく後で調べたいところです。。

                                                                        • -

Unicode使用の切りかえ

                                                                        • -

unicodeサポートが必要ない場合もあるでしょうから、必要なときに設定ファイルで、下記のように設定してください。
デフォルトではOffになってます。
unicode.semantics = On/Off

そうすると、下記がunicodeになります。
すべての文字列リテラル
HTTPリクエストからの変数
PHP識別子

PHPの内部エンコーディングunicodeといなり、それ以外の文字列はシステムが変換するようになります。
unicode.semantics = Onの場合に、バイナリを扱う場合は、それを明示的に宣言してやる必要があります。
unicode.semantics = Offの場合は、今までと変わらない挙動をします。

                                                                        • -

Fallback Encoding

                                                                        • -

unicode.*_encodingを指定しなかった場合に使われます。
fallback_encodingの指定もなかった場合は、UTF-8が使用されます。
unicode.fallback_encoding = "iso-8859-1"

                                                                        • -

Runtime Encoding

                                                                        • -

PHPの内部でバイナリを変換する場合のエンコーディングを指定します。
unicode.runtime_encoding = "iso-8859-1"

                                                                        • -

Output Encoding

                                                                        • -

標準出力の場合に、使用されるエンコーディングです。
unicode.output_encoding = "utf-8"
バイナリの場合は変換しません。
default_charsetは非推奨とされ、今後はunicode.output_setting を使うようになります。
unicode.semantics がOffの場合のみ、default_charsetは有効になります。

                                                                        • -

HTTP Input Encoding

                                                                        • -

開発中です。

                                                                        • -

Filesystem Encoding

                                                                        • -

unicode.filename_encoding = "utf-8"

                                                                        • -

Script Encoding

                                                                        • -

ICUがサポートするエンコーディングが使用できます。
iniで設定する場合
 unicode.script_encoding = utf-8
プログラム内で設定する場合
 
上記はインクルードファイルには影響しません。

                                                                        • -

iniファイル

                                                                        • -

unicode.semanticsがOnの場合、iniの値はUTF-8エンコーディングされていると解釈されます。

                                                                        • -

Stream I/O

                                                                        • -

デフォルトでPHPは、バイナリモードでstreamsをオープンします。
ファイルをテキストモードでオープンするには、tフラグ (もしくは FILE_TEXTパラメータ/以下参照) が必要です。
テキストモードのストリームのデフォルトのエンコーディングUTF-8 です。

                                                                        • -

変換規則とエラー処理

                                                                        • -

バイナリとunicodeを結合しようとした場合、PHPはまずバイナリをunicodeに変換します。
しかし、unicode変換できない文字列があった場合は、下記のエラーを出力して、処理を中止します。
Warning: Could not convert binary string to Unicode string
(converter UTF-8 failed on bytes (0xE9) at offset 2)
逆のエラーの場合は、このようになります。
Warning: Could not convert Unicode string to binary string
(converter ISO-8859-1 failed on character {U+DC00} at offset 2)
unicodeを変換する際に、表現できない文字があった場合の挙動や、変換中にエラーが起こった場合の挙動を変更する方法、そのオプションなどは原文に記載がありますので、ご参照下さい。

                                                                        • -

エラーハンドラの定義

                                                                        • -

エラーハンドラを定義します。
mixed unicode_set_error_handler(callback error_handler)
ユーザーが定義したハンドラがFALSEを返却した場合は、標準のハンドラが実行されます。
☆ハンドラに指定するオプションは、原文に記載がありますので、ご参照下さい。

                                                                        • -

unicodeに完全対応しているエクステンションはこちら。

                                                                        • -

unicodeに完全対応しているエクステンションはこちら。
curl
・ dom
json
mysql
・ mysqli
・ oci8
・ pcre
・ reflection
・ simplexml
soap
sqlite
xml
・ xmlreader/xmlwriter
・ xsl
・ zlib

setlocale()は非推奨になります。
Unicode semanticsがOnの場合に、setlocale()を使用すると、警告が出力されます。