構文記述方法のことで

2008/05/27 | PHPの基本

PHPで画面出力部分を取り扱う場合はテンプレートエンジンを使うことが多いのだが、管理者向け画面などは凝ったデザインの必要がないので、PHP直書きで記述することも多い(直書きであってもテンプレートとして別ファイルにしているが)。そういった場合での、テンプレート内に制御構造を記述する際のメモ。

「テンプレートエンジンと使わない」といっても、何でもかんでもプログラム本体と同様にprint()とか書いていると当然読みにくくなるので、省略形などを使う。例えば、

「<?php print($str); ?>」のかわりに「<?=$str ?>」とか。

あと制御構造も、

<?php
if($condition){
  print(‘hoge’);
}else{
  print(‘fuga’);
}
?>

などと書くとやっぱりわかりづらいので、以下のように記述している。

<?php if($condition): ?>
hoge
<?php else: ?>
fuga
<?php endif; ?>

でも上記のように制御構造を記述する場合、if節の中にif節という具合に入れ子にできないのが難点だ。だって、どの「endif」がどれに対応しているのかわからなくなるから。

これって回避方法はあるんだろうか。マニュアルを見ても書いてなさそうだったんだよね。

文字型関数(ctype)を使った変数チェック

2008/05/26 | PHPの基本

変数チェックで、また自分の知らない(使ったことがない)関数とであった。与えられた変数の値がどのような文字列で構成されているかをチェックするための関数群ctypeだ。以前は正規表現で書いていたりしたのだが、こちらの関数のほうがお手軽で簡単だ。マニュアルには「ctype 関数は、正規表現よりもつねに好ましく、さらに str_* および is_* のような いくつかの等価な関数よりも好ましいことに注意してください。 これは、ctype 関数がネーティブな C ライブラリを使用しており、処理が著しく 高速であるためです。」と書いてある。まぁ、当然ダイレクトにCのライブラリを呼ぶのだから、正規表現との速度の差は明らかだろう(といってもアクセス数が少なければ、そのオーバーヘッドはわからないだろうけど)。

■ ctype_alnum
英数字かどうかを調べる

■ ctype_alpha
英字かどうかを調べる

■ ctype_cntrl
制御文字かどうかを調べる

■ ctype_digit
数字かどうかを調べる

■ ctype_graph
空白以外の印字可能な文字かどうかを調べる

■ ctype_lower
小文字かどうかを調べる

■ ctype_print
印字可能な文字かどうかを調べる

■ ctype_punct
空白、英数字以外の出力可能な文字かどうかを調べる

■ ctype_space
空白文字かどうか調べる

■ ctype_upper
大文字かどうか調べる

■ ctype_xdigit
16 進数を表す文字かどうかを調べる

「ctype_digit」は見たことがあったけど、他にもこんなにあったんだ。さらにマニュアルを読むと「PHP 4.2.0以降、これらの関数はデフォルトで有効となりました。」とあるので昔はモジュールをロードしなくてはいけなかったのね。どうりで知らないわけだ。

Zend Frameworkでping送信

2008/05/23 | Zend Framework

今やブログでおなじみになったping送信。しかしXML-RPCという特性上(かどうかは知らないけれど)、ping送信を実現するためのPHPスクリプトのサンプルを提供しているサイトはほとんどない。やっぱり少しだけ敷居が高いためだろうか。
かくいう自分もping送信はよく理解できなかったのだが「案ずるより産むが易し」で、どこからかサンプルを探してきて、試しているうちに理解できるようになった。
ping送信は生のPOSTデータを取り扱うので、一から自分で書くとPHPやWeb、XML-RPCに関する理解が深まるが、やはりお気楽にプログラムを書きたいところ。今まではPEARなどのライブラリを使って書いていたのだが、それでも結局10行以上書かなくてはならなかった記憶がある。

で、革命。Zend_XmlRpcを使うとたった3行でping送信ができる。サンプルスクリプトはこんな感じ。

require_once ‘Zend/XmlRpc/Client.php';
$client = new Zend_XmlRpc_Client($server);
$client->call(‘weblogUpdates.ping’, array($title, $url));

$serverはping送信先URL、$titleにはブログタイトル、$urlにはブログURLを代入すればいい。1行目はライブラリの読み込みなのだから実質2行でping送信ができるわけだ。

これには参った。ほんと、よくできてるよ、Zend Framework。

変数チェック

2008/05/22 | PHPの基本

最近便利に使っている変数チェック用の関数にemptyがある(なぜ今まで使っていなかったのかが、われながら不思議)。emptyは、その引数である変数が、文字通り「空」であったときにtureを返すわけだが、厳密には以下の場合にtrueを返す(一部マニュアルから抜粋)。

■ “” (空文字列)
$value=”; と定義された場合

■ 0 (0 は整数)
$value=0; と定義された場合

■ “0” (0は文字列)
$value=’0′; と定義された場合

■ NULL
$value=NULL; として定義された場合

■ FALSE
$value=FALSE; として定義された場合

■array() (空の配列)
$value=array(); として定義された場合

■ var $var;(変数が宣言されているが、値が設定されていない)
クラス内で値が設定されていない場合

あと、もう一個便利なのが「未定義の変数を引数として渡した場合」もundefinedなエラーではなく、trueを返してくれる。

便利だ。

RSSの出力

2008/05/21 | Zend Framework

Zend FrameworkにはRSSを処理するためのZend_Feedというライブラリがあるのだが、これは外部のRSSを読み込んで処理するだけでなく、自サイト内のRSSを生成する、といった場合にも使用できる。具体的には以下の通り。

// 基本的な設定は別途保存しておいて呼び出す
$config=Zend_Registry::get(‘config’);
// RSSのためのデータ作成
$data=array();
$data[‘title’]=$config[‘base’][‘title’];
$data[‘link’]=$config[‘base’][‘url’];
$data[‘charset’]=$config[‘base’][‘charset’];
$data[‘description’]=$config[‘base’][‘description’];
$data[‘author’]=$config[‘base’][‘author’];
$data[’email’]=$config[‘base’][’email’];
$data[‘entries’]=array();
//$rowsはデータベースなどから取得した情報(適宜変更)
foreach($rows as $row){
  $data[‘entries’][]=array(
    ‘title’=>$row[‘name’],
    ‘link’=>$config[‘base’][‘url’].’/show?id=’.$row[‘id’],
    ‘description’=>$row[‘message’],
    ‘guid’=>$row[‘id’],
    ‘content’=>$row[‘message’],
    ‘commentRss’=>$config[‘base’][‘url’].’/show?id=’.$row[‘id’],
    ‘lastUpdate’=>strtotime(date(‘Y-m-d H:i:s’,$row[‘created’])),
  );
}

いろいろな方法が取れるとは思うが、とりあえず形になったのでメモだけしておく。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net