phpの勉強

まず、コマンドラインで動かしてみました。

$ php -v
PHP 5.2.2 (cli) (built: May  2 2007 19:18:26)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

配列

以降、確認しやすさのために、コマンドの後に「| w3m -T text/html -dump」してます。

配列作成
$ php -r '$a = array(1, 2); print_r($a);'
Array ( [0] => 1 [1] => 2 )
要素の設定
$ php -r '$a = array(1, 2); $a[5] = 5; print_r($a);'
Array ( [0] => 1 [1] => 2 [5] => 5 )
$ php -r '$a = array(1, 2); $a[5] = 5; $a[4] = null; print_r($a);'
Array ( [0] => 1 [1] => 2 [5] => 5 [4] => )
sort
$ php -r '$a = array(1, 2, 5, 4); var_dump(sort($a));'
bool(true)

げ、普通に破壊的?

$ php -r '$a = array(1, 2, 5, 4); sort($a); print_r($a);'
Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 )

Hash

Hash生成
$ php -r '$a = array("a" => 1);print_r($a);'
Array ( [a] => 1 )
$ php -r '$a = array("0" => "00");var_dump($a);'
array(1) { [0]=> string(2) "00" }

文字列”0″をキーにしたつもりが、もう数値になってる。でもこれは、var_dumpの仕業かも。

sort
$ php -r '$a = array("a" =>"aa", "b" => "bb", "0" => "00");asort($a);print_r($a);'
Array ( [0] => 00 [a] => aa [b] => bb )
$ php -r '$a = array("a" =>"aa", "b" => "bb", "0" => "00");ksort($a);print_r($a);'
Array ( [a] => aa [0] => 00 [b] => bb )

結果が違う?そもそも、キーソート(ksort)って?

bool asort ( array &array [, int sort_flags] )

この関数は、 連想配列において各配列のキーと要素との関係を維持しつつ配列をソートします。 この関数は、 主に実際の要素の並び方が重要である連想配列をソートするために使われます。

http://manual.xwd.jp/function.asort.html

bool ksort ( array &array [, int sort_flags] )

キーとデータの関係を維持しつつ、配列をキーでソートします。 この関数は、主として連想配列において有用です。

http://manual.xwd.jp/function.ksort.html

まだわからない。

スコープ

変数のスコープ

http://search.net-newbie.com/php/language.variables.scope.html

おもしろいものみつけた。

static変数は、再帰関数を実現する1つの手段としても使用されます。再帰 関数は、自分自身をコールする関数です。再帰関数を書くときには、無限 に再帰を行う可能性があるため、注意する必要があります。適当な方法に より再帰を確実に終了させる必要があります。次の簡単な関数は、中止す るタイミングを知るためにstatic変数$countを用いて、 10 回まで再帰を行います。

<?php
function Test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test();
}
$count--;
}
?>

これって再帰って呼べるのだろうか。static変数使ってるし、同時に呼ばれたらダメじゃん。。。

と思って考えてみると、PHPはブラウザから1リクエスト呼ばれる毎に環境作り直されて、実行している行は常に1行のみになるのか。

うわ。これは気楽ですね。

注意: 静的変数は、上の例に見られるような方法で宣言されます。 式の結果を静的変数に代入しようとすると、パースエラーが 発生します。

static $int = 0; // 正しい

static $int = 1+2; // 間違い(式を代入しています)

static $int = sqrt(121); // 間違い(同じく式を代入しています)

え、定数にしか依存しない計算はコンパイル時に最適化とかされないのかな。

再帰関数を書いてみる

別に普通の再帰ができない訳ではないみたい。

<?php
function print_list($index) {
if ($index == 0) return;
print "$index\n";
print_list($index - 1);
}
print_list(5);
?>

結果

5
4
3
2
1
$

でも、ちょっとふざけて、print_list(50000); をしたら、

...
...
165
164
163
162
161
160
$ echo $?
1

160までしか表示されなく、しかもエラー表示も出ないでプロンプトが戻ってきた。

リターンコードは、1のようですが、寡黙すぎないか?標準エラー出力に何か吐いてもいいと思う。

まとめ

えと、スコープを調べようとしてたんだけど。。

次はスコープから

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください