Home > PHP
PHP Archive
PHPで1から100を表示
- 2006-09-29 (金)
- PHP
PHPで1から100の数字を表示するコードをスマートに書くネタがGANCHIKU.comで紹介されていました。
他のPHPerな方だったら、どんな書き方するかなー。
会社で楽しかった瞬間。 at GANCHIKU.com (2006-09-29)
との事なので反応してみました。(ちなみに元ネタは人力検索はてな-PHPのコードを教えてください。…)
まずぱっと思いついたコードがこちら
< ?php echo "<table>"; for ($i = 0 ; $i < 10 ; $i++) { echo "<tr>"; for ($j = 0 ; $j < 10 ; $j++) { printf("<td>%d< /td>", $i * 10 + $j + 1); } echo "< /tr>"; } echo "< /table>"; ?>
まあ何の変哲もないコードです。ただ誰が見ても分かりやすいと思います。
で、エントリのワンライナーがかっこ良かったのでインスパイアwして書いたのがこちら
$ php -r 'foreach (range(0,9) as $v1) { foreach (range(1,10) as $v2) { printf("%02d ", $v1*10+$v2); } echo "\n"; }'
あんま変わってないです。。。
しかしPHPにはいろいろな配列関数がありますね。range()とかarray_chunk()とかは今回のエントリを見るまで知りませんでした。(array_chunk()は同じようなのを以前に自作した覚えがあったり。)
- コメント (Close): 2
- Trackbacks: 0
CakePHP array-based Active Record
NYPHPにて行われたCakePHPプレゼンのレビュー記事です。
Last night at the monthly NYPHP meeting, Nate Abele presented an introduction to CakePHP, a web application framework.
Chris Shiflett: CakePHP Visits New York (2006-09-28)
CakePHPの特徴が簡潔に書かれていて興味深い内容なのですが、以下の一文にピクッときました。
Cake has an array-based Active Record implementation.
私が初めてCakePHPを触った時に感じた印象(違和感)がまさにこれでした。うーん、ぴったりの表現です。
Cakeを初めて触る方はこれを頭にいれておけばすんなり入れるかと思います。
エントリのコメントを見るとプレゼンを行ったnateからこの件についてコメントがありました。
(1) The reason we decided to go with an array-based approach to ActiveRecord had to do with PHP4, but it also has a lot to do with the fact that even in PHP5, the array support, (i.e. all the great things you can do with arrays really simply) still outweigh PHP’s ability to manipulate objects.
配列ならシンプルだし、オブジェクトより速いでしょ。という事ですね。まあこれはこれでアリですね。
- コメント (Close): 0
- Trackbacks: 1
PHP4.2系でPEAR::Mail_mimeDecodeを使う
- 2006-09-27 (水)
- PHP
PEAR::Mail_mimeDecodeは送信されたメールをパースするクラスなのですが、PHP4.2系環境だと以下のようなNoticeが出てしまいます。
PHP Notice: Use of undefined constant __CLASS__ - assumed '__CLASS__' in /usr/local/lib/php/pear/Mail/mimeDecode.php on line 178
これはMail_mimeDecode#decode内で__CLASS__を使用しているために発生します。(__CLASS__は4.3.0からサポート)
アドホックな方法ですがPHP4.2系環境では__CLASS__を以下のように書き換えればokです。
// determine if this method has been called statically //$isStatic = !(isset($this) && get_class($this) == __CLASS__); $isStatic = !(isset($this) && get_class($this) == strtolower('Mail_mimeDecode'));
2006/10/05追加:
考えてみれば__CLASS__を定義しておけば良いですね。(そういえば前にis_a()で同じような事をしてました。。。)
< ?php if (!defined('__CLASS__')) { // メソッド内に書くなら define('__CLASS__', get_class($this)); // それ以外なら define('__CLASS__', strtolower('Mail_mimeDecode')); } ?>
- コメント (Close): 0
- Trackbacks: 0
Ajaxと組み合わせる言語
- 2006-09-26 (火)
- PHP
Ajaxと組み合わせる言語1位はPHPだそうです。
言語ではPHPがもっとも人気が高く、次いでJavaとなっている。
もっとも人気のあるAJAX言語は? フレームワークは? (MYCOMジャーナル) (2006-09-26)
今時のサイトではAjax+PHPがトレンドなのでしょうか。PerlやRoR・ColdFusionなどを抑えて、Javaが2位というのが意外な気がしました。
- コメント (Close): 0
- Trackbacks: 0
CakePHP1.1.8.3544への移行
既にCakePHP1.1.7.3363で動作しているシステムをCakePHP1.1.8.3544にアップグレードする方法です。
- 念のため既存のソースを全てバックアップ
- 1.1.8.3544のcake/を既存のcake/にコピー
- 1.1.8.3544のapp/webroot/css.php,app/webroot/js/vendors.phpを既存のディレクトリにコピー
フレームワークを変更している場合は別途修正が必要になりますのでご注意を。
ちなみに以前このサイトで公開したパッチは1.1.8.3544でもそのまま使用できます。もしご利用の方は1.1.8.3544にアップグレード後、パッチを当ててください。
- コメント (Close): 0
- Trackbacks: 0
CakePHP1.1.8.3544リリース
CakePHP1.1.8.3544がリリースされています。1.1系では最後のリリースになるようです。1.2系は来年みたいですね。
CakePHP 1.1.8.3544 is the latest release and brings us to the point of some more exciting new changes.
While this release signals the end of the 1.1 series, it also provides the starting point for the next year.CakeForge: CakePHP: File Release Notes and Changelog (2006-09-22)
数多くの修正が行われており、先日のvendors.phpに関する修正も取り込まれているのでアップデートした方が良いでしょう。
ダウンロード:http://cakeforge.org/frs/?group_id=23&release_id=134
# ダウンロードファイル選択後に寄付を呼びかけるページが表示されます。
# 寄付しない場合は「No Thanks」を選択すればダウンロードページへ進めます。
- コメント (Close): 0
- Trackbacks: 0
PHP_CodeSnifferを試してみる
- 2006-09-21 (木)
- PHP
PHP_CodeSnifferはPHPのコードスタイルをチェックするツールです。0.1.0ではPEARのコーディング基準に適合するかどうかを確認できますので、いくつか試してみました。
まずは簡単にPHP_CodeSnifferの使い方から。
PHP_CodeSnifferを使う
インストール
pearコマンドでインストールするだけです。
$ pear install PHP_CodeSniffer-0.1.0
CLI環境ではPEARパッケージに含まれているphpcsコマンドでチェックができます。
使用例
まずありがちなサンプルファイルでチェックしてみます。チェックするソースは以下です。
< ?php class Hello { var $message = null; function __construct($message) { $this->message = $message; } function hello() { echo("Hello! PHP"); echo($this->message); } } $obj = new Hello("Cake is sweet."); $obj->hello(); ?>
phpcsでチェックします。
$ phpcs -v hello.php Registering sniffs... DONE Processing hello.php [93 tokens in 17 lines]... DONE in < 1 second FILE: hello.php -------------------------------------------------------------------------------- FOUND 8 ERROR(S) AND 0 WARNING(S) AFFECTING 6 LINE(S) -------------------------------------------------------------------------------- [LINE 3] ERROR: Line indented incorrectly. Expected at least 4 spaces, but found 2. [LINE 5] ERROR: Opening function brace should be on a new line. [LINE 5] ERROR: Line indented incorrectly. Expected 4 spaces but found 2. [LINE 6] ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4. [LINE 9] ERROR: Opening function brace should be on a new line. [LINE 9] ERROR: Line indented incorrectly. Expected 4 spaces but found 2. [LINE 10] ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4. [LINE 11] ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4. -------------------------------------------------------------------------------- [/code] <p>いろいろ出てきましたが、ほとんどがインデントに関するものです。(PEARではインデントは4スペースが推奨です。)あとメソッド定義で[{]を続けて書くのがまずいようです。ソースを修正して再度チェックします。 $ phpcs -v hello1.php Registering sniffs... DONE Processing hello1.php [95 tokens in 19 lines]... DONE in < 1 second [/code] <p>無事エラーはなくなりました。 <h2>PEARをチェック</h2> <p>PEAR.phpで試してみました。これは適合して当たり前でしょう。</p> $ phpcs -v --report=summary PEAR.php Registering sniffs... DONE Processing PEAR.php [5550 tokens in 1101 lines]... DONE in 2 seconds PHP CODE SNIFFER REPORT SUMMARY -------------------------------------------------------------------------------- FILE ERRORS WARNINGS -------------------------------------------------------------------------------- PEAR.php 117 30 -------------------------------------------------------------------------------- A TOTAL OF 117 ERROR(S) AND 30 WARNING(S) WERE FOUND IN 1 FILE(S) --------------------------------------------------------------------------------
出まくってますね。。。エラー内容を見るとさすがにインデント関係は出ていないですが、カンマや条件文でエラーが出ています。あと改行がCR+LFになってますね。これは良いのかな?
PHP_CodeSnifferをチェック
つぎはPHP_CodeSniffer自身です。PHP/CodeSnifferディレクトリ以下をチェックしました。
$ phpcs -v --reort=summary PHP/CodeSniffer Registering sniffs... DONE (snip) PHP CODE SNIFFER REPORT SUMMARY -------------------------------------------------------------------------------- FILE ERRORS WARNINGS -------------------------------------------------------------------------------- PHP/CodeSnifferCommentParserAbstractDocElement.php 0 8 PHP/CodeSnifferCommentParserAbstractParser.php 0 13 PHP/CodeSnifferCommentParserClassCommentParser.php 0 7 PHP/CodeSnifferCommentParserCommentElement.php 0 7 PHP/CodeSnifferCommentParserDocElement.php 0 0 PHP/CodeSnifferCommentParserFunctionCommentParser.php 0 4 PHP/CodeSnifferCommentParserMemberCommentParser.php 0 2 PHP/CodeSnifferCommentParserPairElement.php 0 4 PHP/CodeSnifferCommentParserParameterElement.php 0 6 PHP/CodeSnifferCommentParserParserException.php 0 0 PHP/CodeSnifferCommentParserSingleElement.php 0 4 PHP/CodeSnifferException.php 0 0 PHP/CodeSnifferFile.php 0 62 PHP/CodeSnifferSniff.php 0 4 PHP/CodeSnifferSniffException.php 0 0 PHP/CodeSnifferStandardsAbstractPatternSniff.php 0 33 PHP/CodeSnifferStandardsAbstractScopeSniff.php 0 15 PHP/CodeSnifferStandardsAbstractVariableSniff.php 0 14 PHP/CodeSnifferStandardsIncorrectPatternException.php 0 0 ...ferStandardsPEARSniffsCommentingInlineCommentSniff.php 0 1 ...StandardsPEARSniffsConstantsValidConstantNameSniff.php 0 11 ...rdsPEARSniffsControlStructuresControlSignatureSniff.php 0 1 ...eSnifferStandardsPEARSniffsFilesIncludingFileSniff.php 0 8 ...CodeSnifferStandardsPEARSniffsFilesLineLengthSniff.php 0 3 ...tandardsPEARSniffsMethodsFunctionCallSignatureSniff.php 0 9 ...ardsPEARSniffsMethodsMethodCallArgumentSpacingSniff.php 0 11 ...rStandardsPEARSniffsMethodsOpeningMethodBraceSniff.php 0 5 ...erStandardsPEARSniffsMethodsValidDefaultValueSniff.php 0 3 ...odeSnifferStandardsPEARSniffsMiscShortOpenTagSniff.php 0 5 ...dardsPEARSniffsNamingConventionsValidClassNameSniff.php 0 4 ...dsPEARSniffsNamingConventionsValidFunctionNameSniff.php 0 19 ...nifferStandardsPEARSniffsPHPLowerCaseConstantSniff.php 0 2 ...StandardsPEARSniffsStatementsMultipleStatementSniff.php 0 21 ...StandardsPEARSniffsWhiteSpaceScopeClosingBraceSniff.php 0 5 ...ifferStandardsPEARSniffsWhiteSpaceScopeIndentSniff.php 0 13 PHP/CodeSnifferTokens.php 0 0 -------------------------------------------------------------------------------- A TOTAL OF 0 ERROR(S) AND 304 WARNING(S) WERE FOUND IN 36 FILE(S) --------------------------------------------------------------------------------
WARNINGは出ていますが、ERRORは無いです。さすがです。
CakePHPをチェック
おまけでCakePHPです。CakePHPのソースは荒っぽいところが残っているので興味津々です。(エラーが多く出そうで:-P)[cake/dispatcher.php]をチェックしてみました。
$ phpcs -v --report=summary cake/dispatcher.php Registering sniffs... DONE Processing dispatcher.php [3450 tokens in 430 lines]... DONE in 1 second PHP CODE SNIFFER REPORT SUMMARY -------------------------------------------------------------------------------- FILE ERRORS WARNINGS -------------------------------------------------------------------------------- cakedispatcher.php 301 26 -------------------------------------------------------------------------------- A TOTAL OF 301 ERROR(S) AND 26 WARNING(S) WERE FOUND IN 1 FILE(S) --------------------------------------------------------------------------------
301 ERROR(S)!!と期待(?)を裏切らない結果になったのですが、エラー内容を見るとほとんどはインデントのエラーでした。なのでそれを除外するとエラーは26個になりました。[エラー内容(除くインデントエラー)]
エラーはif文、foreach文のスペース、メソッド宣言でのブレース位置くらいですね。まあCakePHPはPEARコーディング規約で書かれているわけではないですけど、わりと適合していたのは意外でした。
PEAR標準ソースを書く
こうしていくつかのソースを見てみるとおおよそひっかかりそうな箇所が見えてきます。PEARコーティング規約に適合するソースを書くにあたってとりあえず気をつけておく点を並べてみました。
- インデントは4スペース
- メソッド定義にてブレース[{]は次の行に書く
- if,foreachなので制御構造ではキーワードと[(]の間にスペースを入れる
- 改行はLF?
- 一行85桁まで。
- 変数の代入式を並べる時は値が縦に並ぶようにスペースを入れる。
cvsやsvnにコミットする時に自動的にチェックするとかunitテストに盛り込むなどアイデア次第で面白い事ができそうです。
- コメント (Close): 0
- Trackbacks: 0
PHPで$a{N}表現
- 2006-09-21 (木)
- PHP
PHP_CodeSnifferのソースを見てたときに気づいたのですが、PHPで$a{N}という表現ができることを初めて知りました。
< ?php $a = "abc"; echo $a{0} . "\n"; echo $a{1} . "\n"; echo $a{2} . "\n"; ?>
$ php -f test.php a b c
substr($a, N, 1)と同じですね。(マニュアル見たら載ってました。。。)
ちなみに日本語はばっちり化けます。
< ?php $a = "あいう"; echo $a{0} . "\n"; echo $a{1} . "\n"; echo $a{2} . "\n"; ?>
$ php -f test.php 、 「 、
- コメント (Close): 0
- Trackbacks: 0
PHP開発に便利な早見表集
- 2006-09-20 (水)
- PHP
※PostgreSQLとFirebird2の早見表を追加しました。(2006/11/07)
※Prototypeの早見表を追加しました。(2007/01/12)
PHP開発に役立つ早見表(cheat sheet)をまとめてみました。
PHP全般
-
PHP Cheat Sheet
スーパーグローバル変数、日付・時間フォーマット、正規表現、PCRE、関数定義、fopenモード - Filtering & Escaping Cheat Sheet
入出力値のフィルタリング・エスケープ処理。(POPなデザインで楽しいです) -
PCRE Cheat Sheet
PCRE(Perl Compatible Regular Expressions-preg*系で使う正規表現) - Regular Expressions Cheat Sheet
正規表現
データベース
-
MySQL Cheat Sheet
MySQL-関数、データ型、PHP関数、サンプルSQL -
PostgreSQL Cheat Sheet
PostgreSQL-関数、データ型、便利なSQL、インフォメーションスキーマ -
Firebird2 Cheat Sheet
MySQL-関数、データ型、PHP関数、便利なSQL
その他
-
symfony Admin Generator cheat sheet
symfony-admin generator - CakePHP cheatsheet
CakePHP-フレームワーク概要 - Smarty cheat sheet for template designers
Smarty-テンプレート - http://refcards.com/refcards/apache/index.html
Apache-httpdコマンド、各ディレクティブ - mod_rewrite Cheat Sheet
Apahce-mod_rewrite - CSS Cheat Sheet
CSS-プロパティリスト、書式、セレクタ、疑似セレクタ、メディアタイプ、ボックスモデル、単位、継承 - JavaScript Cheat Sheet
JavaScript-関数・メソッド、XMLHttpRequest、HTMLへの記述、正規表現、イベントハンドラ -
Prototype 1.5.0 Cheat Sheet – Snook.ca
Prototype
どれもPDFで提供されていますので、印刷してクリアファイルにでも入れておけば便利かもしれませんね。
# mod_rewriteは設定の度にgoogleで調べているので、手元にあると役立ちそうです。
- コメント (Close): 0
- Trackbacks: 0
CakePHP controller共通のモデル、コンポーネント、ヘルパーを設定する
controller共通のモデル、コンポーネント、ヘルパーを設定する方法です。
We all know the problem, there are always Models, Components or Helpers that we need for about 99% of all our actions/views and therefor would fit beautifully in our AppController. The only problem is, as soon as we define them via “var $uses = array(‘…’);” (etc.), we cannot easily add more items in our derived controllers without having to repeat the entire list.
ThinkingPHP and beyond » Dessert #10 – Default Models, Components & Helpers (2006-09-19)
これ私も気になっていた箇所なので、そうそう、といった感じでした。エントリではAppControllerのコンストラクタで$uses,$components,$helpersをマージする方法が紹介されています。
こういう方法もあるかなーと見ていると、上記エントリのコメントでさっくりと突っ込まれました。実はこれControllerクラスのコンストラクタでマージしてくれるようになっているんですね。以下のソースでAppControllerで設定したコンポーネントがTestControllerで使えます。すっきり、すっきり。
[app/app_controller.php]
< ?php class AppController extends Controller { var $components = array('RequestHandler'); } ?>
[app/controllers/test_controller.php]
< ?php class TestController extends AppController { var $name = "Test"; var $components = array('Session'); function index() { // RequestHandlerもSessionも使える if ($this->RequestHandler->isGet()) { $this->Session->destroy(); } } } ?>
- コメント (Close): 0
- Trackbacks: 1
ホーム > PHP
- 検索
- フィード
- メタ情報