ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2012年2月14日火曜日

MAMPのPHPでpeclを使う(Mac OSX Lion編)



今日も同居人のデバッグを手伝っています。


PECLでoauthのプラグイン使いたいらしい。


pecl install oauthやるとエラーが出るそうで。


とりあえず以下のブログ参考にしつつやるとpecl install oauth出来た。


MAMP + OAuth + Lion





2011年9月22日木曜日

PHPのforeachのちょっと嫌なところ



PHPのforeachの嫌なところが1つあります。


foreach ($a as $k => $v) { ... }の$kと$vが上書きされてしまうところです。




<?php
$name = 'hanachin';
$flat = array(101 => 'Kato', 102 => 'Yoshida', 201 => 'Sato');

echo "Hello, I'm $name", PHP_EOL;
foreach ($flat as $room_no => $name) {
// $name = $flat[$room_no]みたいな処理が入ってる(?)
echo "room #$room_no: $name", PHP_EOL;
}
echo "Hello, I'm $name", PHP_EOL;

# Output:
# Hello, I'm hanachin
# room #101: Kato
# room #102: Yoshida
# room #201: Sato
# Hello, I'm Sato
# --------
?>


$nameが上書きされてしまいました。


参照と組み合わせるともっと厄介です。


foreachで使った参照をunsetしないままforeachを使うと配列の最後の要素を意図せず書き換えてしまうことがあります。



<?php
$name = 'hanachin';
$flat = array(101 => 'Kato', 102 => 'Yoshida', 201 => 'Sato');

echo "Hello, I'm $name", PHP_EOL;
foreach ($flat as $room_no => &$name) {
// $name = &$flat[$room_no]みたいな処理が入ってる(?)
}
// foreachを抜けても$nameは$flatの最後の要素、$flat[201]への参照を持っている

foreach ($flat as $room_no => $name) {
// $name = $flat[$room_no]みたいな処理が入ってる(?)
// $nameは$flat[201]と同じところを指しているので
// $nameと$flat[201]の値が、$flat[$room_no]の値で上書きされていく
echo "room #$room_no: $name", PHP_EOL;
}
echo "Hello, I'm $name", PHP_EOL;

# Output:
# Hello, I'm hanachin
# room #101: Kato
# room #102: Yoshida
# room #201: Yoshida
# Hello, I'm Yoshida
# --------
?>


解決するためにはforeachでリファレンスを使ったら必ずその直後でunsetします。



<?php
$name = 'hanachin';
$flat = array(101 => 'Kato', 102 => 'Yoshida', 201 => 'Sato');

echo "Hello, I'm $name", PHP_EOL;
foreach ($flat as $room_no => &$name) {
}
unset($name); // 参照を削除

foreach ($flat as $room_no => $name) {
echo "room #$room_no: $name", PHP_EOL;
}
echo "Hello, I'm $name", PHP_EOL;

# Output:
# Hello, I'm hanachin
# room #101: Kato
# room #102: Yoshida
# room #201: Sato
# Hello, I'm Sato
# --------
?>


「foreach ($a as $k => $v) {}の$kと$vがforeachの中だけのスコープを持っていて、foreachの外の変数に影響及ぼさないと嬉しいのになぁ」と思いました。まる。


参考


PHP: foreach - Manual


PHP: 変数のスコープ - Manual





2011年9月21日水曜日

ローマ字を数値に変換(__callStaticを使って)



毎日PHP書くといいがち書いてなかったので今日はPHPも書きます。


7つの言語7つの世界、Rubyのp33で出てた例は美しかったけどなんか、これだと微妙です。


見た目が美しくない。



マジックメソッドの__callStaticで、呼び出したメソッドの名前(ローマ数字)を数に変換して返しています。





2011年9月14日水曜日

PHPで入力された文字列の長さのフィルタリング



PHP: Filter - Manualを参考に。


文字列の長さもフィルタリングしたい。


ユーザー定義の関数でデータをフィルタリングしたいときはFILTER_CALLBACKフィルタを使う。


例えば1文字以上5文字以下の文字列なら



<?php
function FILTER_VALIDATE_LENGTH($value) {
$len = mb_strlen($value);
if (1 <= $len && $len <= 5) {
return $value;
}
return false;
}

$tests = array(
'', // 空文字列
'', // 1文字
'あいうえお', // 5文字
'あいうえおか', // 6文字
);

foreach ($tests as $test) {
var_dump(filter_var($test, FILTER_CALLBACK, array('options' => 'FILTER_VALIDATE_LENGTH')));
}



$ php foo.php
bool(false)
string(3) "あ"
string(15) "あいうえお"
bool(false)

任意の長さの文字列をフィルタリングしたいなら(ついでにエンコーディングも指定したい場合)



<?php
function makeFilterValidateLength($min, $max, $encoding = null) {
if (is_null($encoding)) {
$encoding = mb_internal_encoding();
}

return function ($value) use ($min, $max, $encoding) {
$len = mb_strlen($value, $encoding);
if ($min <= $len && $len <= $max) {
return $value;
}
return false;
};
}

$tests = array(
'', // 空文字列
'', // 1文字
'あいうえお', // 5文字
'あいうえおか', // 6文字
);

foreach ($tests as $test) {
var_dump(filter_var($test, FILTER_CALLBACK, array('options' => makeFilterValidateLength(5, 5))));
}



$ php foo.php
bool(false)
bool(false)
string(15) "あいうえお"
bool(false)

エンコーディングの指定が省略されてたらmb_internal_encoding()を使うようにする。





PHPのファイルの文法が正しいかどうか確認する





  • lか--syntax-checkオプションを使う。



$ php -l foo.php
$ php --syntax-check foo.php




2011年9月13日火曜日

PHPでフィルタリングを連続して適用したい



日中はずっとPHPと睨めっこです。息抜きに書くPHPも必要。とりあえず、1日1つは息抜きで何かを書きます。



フィルタリングを連続して適用する


1つ前の記事、PHPで入力された文字列の長さのフィルタリング - はなちん C-x C-cで書いたフィルタを連続して適用したかったのでごにょごにょ書いてたらこうなりました。



<?php
function strWithLine($str) {
return str_repeat('-', 8) . $str . str_repeat('-', 8);
}

function makeFilterValidateLength($min, $max, $encoding = null) {
if (is_null($encoding)) {
$encoding = mb_internal_encoding();
}

return function ($value) use ($min, $max, $encoding) {
$len = mb_strlen($value, $encoding);
if ($min <= $len && $len <= $max) {
return $value;
}
return false;
};
}

function makeFilterWrapped($filter = FILTER_UNSAFE_RAW, $options = null) {
return function ($value) use ($filter, $options) {
return filter_var($value, $filter, $options);
};
}

function ret($value) {
return $value;
}

function bind($f, $g) {
return function ($value) use ($f, $g) {
if ($f($value) === false) {
return false;
}
return $g($value);
};
}

$test = 'example@example.com';
$m = 'ret';
$f1 = makeFilterValidateLength(0, 1);
$f2 = makeFilterValidateLength(0, 19);
$g = makeFilterWrapped(FILTER_VALIDATE_EMAIL);
$fail_filters = array(
bind('ret', $f1),
$f1,
bind($f1, 'ret'),
$f1,
bind(bind($m, $f1), $g),
bind($m, bind(function ($x) use($f1) { return $f1($x); }, $g)),
);
$pass_filters = array(
bind('ret', $f2), $f2,
bind($f2, 'ret'), $f2,
bind(bind($m, $f2), $g), bind($m, bind(function ($x) use($f2) { return $f2($x); }, $g)),
);

echo strWithLine('fail_filters'), PHP_EOL;
foreach ($fail_filters as $filter) {
var_dump(filter_var($test, FILTER_CALLBACK, array('options' => $filter)));
}

echo strWithLine('pass_filters'), PHP_EOL;
foreach ($pass_filters as $filter) {
var_dump(filter_var($test, FILTER_CALLBACK, array('options' => $filter)));
}


もっと色々とうまく出来るようになりたい。





2011年9月8日木曜日

PHP技術者認定初級試験の認定証が届きました



今日から初級認定PHPer! ステッカーが1枚ついてました。


MacBook Airにまだステッカー貼ってないんですよね、貼ろうか悩み中です。


11月から始まる上級試験も受けたいと思います。


PHPは便利な関数もいっぱいあるのですが無知のせいで使えてない感じがしてます。


昨日初めてfill_varという超便利な関数を知りました。URLやE-MailアドレスやIPアドレスの検証・サニタイズ等行えます。


資格は上級目指して、普段PHP書くときはPHPらしく書けるように頑張ります。


f:id:h6n:20110908000719j:image





2011年8月19日金曜日

PHP5技術者認定初級試験に合格しました。



授業のカリキュラムの1つとしてPHPを勉強しています。


今日初級試験 - PHP技術者認定試験を受けてきました。


まだ新しい検定です。Twitterもやってます→@フォローしました。


プロメトリックの試験センターで受けられます。沖縄だと産業支援センターが試験会場として選べます。


一応合格しましたが72点、合格ラインぎりぎり orz


レポートはこんな感じです。


f:id:h6n:20110819125334j:image


0%だったのが




  • 日付と時刻の取り扱い

  • セキュリティ

  • 出力バッファ

  • 定数・予約語


これは酷い。これからここを勉強しなければ。


今回受けた初級試験の出題範囲は



初めてのPHP5

初めてのPHP5







のカバーしている範囲から万遍なく出ます。詳しくは公式サイトを見てください。


また、9月からは上級試験が開始されるようです。上級試験の内容は



プログラミングPHP 第2版

プログラミングPHP 第2版







から出るようなので今から勉強して卒業までに取得できたら嬉しいな。


受けてみての感想


万遍無く出るので普段使わない機能まで勉強出来ました。普通に使っていれば分かりそうな問題もあればちょっと細かい問題もありました。


あと、レポートで間違ったところがはっきり分かるので嬉しいですね。理解が足りてないところを重点的に勉強出来ます。


合格はしたけどまだまだ仕事で使うには能力が足りてない。趣味でSchemeしつつ、noviceからexpertなPHPerになるべく、プログラミングPHPを読んでいきます。


9月の試験が楽しみ!





2011年7月21日木曜日

PHPで1行掲示板を1行で書いてみた。





<form method=post><input name=m><input type=submit><?($s=htmlspecialchars(@$_POST[m]))&&fputs(fopen('f','a'),"<br>$s")?><?=join(file('f'));

ネタ。とりあえずつぶやける長さを目指して、達成。`cat f`したり色々試したけど不毛な気がして終了。short_open_tagとか有効になってないと動きません、多分。


追記:


ちょっと縮んだ!



<form method=post><input name=m><input type=submit><?($s=htmlspecialchars(@$_POST[m]))&&fputs(fopen('f','a'),"<br>$s");@include f;


追記2:


さらにもうちょっと縮んだ!



<form method=post><input name=m><input type=submit><?($s=htmlentities(@$_POST[m]))&&fputs(@fopen(f,'a'),"<br>$s");@include f;


追記3:


文字コードのチェックとかもしたいんだけど、どうすればいいだろ…