Home > PHP

PHP Archive

PHPで1から100を表示

  • 2006-09-29 (金)
  • PHP
この記事の所要時間: 129

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()は同じようなのを以前に自作した覚えがあったり。)

CakePHP array-based Active Record

この記事の所要時間: 138

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.

配列ならシンプルだし、オブジェクトより速いでしょ。という事ですね。まあこれはこれでアリですね。

PHP4.2系でPEAR::Mail_mimeDecodeを使う

  • 2006-09-27 (水)
  • PHP
この記事の所要時間: 145

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'));
}
?>

Ajaxと組み合わせる言語

  • 2006-09-26 (火)
  • PHP
この記事の所要時間: 023

Ajaxと組み合わせる言語1位はPHPだそうです。

言語ではPHPがもっとも人気が高く、次いでJavaとなっている。

もっとも人気のあるAJAX言語は? フレームワークは? (MYCOMジャーナル) (2006-09-26)

今時のサイトではAjax+PHPがトレンドなのでしょうか。PerlやRoR・ColdFusionなどを抑えて、Javaが2位というのが意外な気がしました。

CakePHP1.1.8.3544への移行

この記事の所要時間: 038

既に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にアップグレード後、パッチを当ててください。

CakePHP1.1.8.3544リリース

この記事の所要時間: 17

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」を選択すればダウンロードページへ進めます。

PHP_CodeSnifferを試してみる

  • 2006-09-21 (木)
  • PHP
この記事の所要時間: 1540

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)
--------------------------------------------------------------------------------
&#91;LINE 3&#93; ERROR: Line indented incorrectly. Expected at least 4 spaces, but found 2.
&#91;LINE 5&#93; ERROR: Opening function brace should be on a new line.
&#91;LINE 5&#93; ERROR: Line indented incorrectly. Expected 4 spaces but found 2.
&#91;LINE 6&#93; ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4.
&#91;LINE 9&#93; ERROR: Opening function brace should be on a new line.
&#91;LINE 9&#93; ERROR: Line indented incorrectly. Expected 4 spaces but found 2.
&#91;LINE 10&#93; ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4.
&#91;LINE 11&#93; ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4.
--------------------------------------------------------------------------------
&#91;/code&#93;
<p>いろいろ出てきましたが、ほとんどがインデントに関するものです。(PEARではインデントは4スペースが推奨です。)あとメソッド定義で[{]を続けて書くのがまずいようです。ソースを修正して再度チェックします。


$ phpcs -v hello1.php
Registering sniffs... DONE
Processing hello1.php [95 tokens in 19 lines]... DONE in < 1 second
&#91;/code&#93;
<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テストに盛り込むなどアイデア次第で面白い事ができそうです。

PHPで$a{N}表現

  • 2006-09-21 (木)
  • PHP
この記事の所要時間: 047

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
、
「
、

PHP開発に便利な早見表集

  • 2006-09-20 (水)
  • PHP
この記事の所要時間: 221

※PostgreSQLとFirebird2の早見表を追加しました。(2006/11/07)
※Prototypeの早見表を追加しました。(2007/01/12)

PHP開発に役立つ早見表(cheat sheet)をまとめてみました。

PHP全般

データベース

その他

どれもPDFで提供されていますので、印刷してクリアファイルにでも入れておけば便利かもしれませんね。
# mod_rewriteは設定の度にgoogleで調べているので、手元にあると役立ちそうです。

CakePHP controller共通のモデル、コンポーネント、ヘルパーを設定する

この記事の所要時間: 229

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

  }
}
?>

ホーム > PHP

検索
フィード
メタ情報

Return to page top