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。
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での管理から開発者のサイトでの管理に移ったみたい。
すると、ディレクトリへの書き込み権限エラー。
PEARの設定がデフォルトだとおかしくなっているようで、参照すべきディレクトリを参照できていないよう。
なのでgo-pear.batを叩いて設定変更、確認。
go-pear.batを叩いてインストール完了した後、ついでにpear_infoをインストールしておく。
次に、本命のPHPUnit3をインストールしていく。デフォルトでPHPUnitとPHPUnit2がインストールされているので、PHPUnitをrenameしておくと良い。
その後、再度チャンネルを登録。インストール。-aオプションはお好みで。ダーッとインストールされたら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()を使用すると、警告が出力されます。