PHP の関数
PHP の関数について、書き散らしたメモ。

関数宣言
<?php
function foo() {
// 処理
}


引数のデフォルト
<?php
function say_hello($greeting, $name = 'World') {
echo "$greeting, $name!", PHP_EOL;
}

say_hello('Bye', 'fkmn'); //=> Bye, fkmn
say_hello('Hello'); //=> Hello, World

// 呼び出し時に、デフォルトの無い引数が指定されていない場合は、
// 警告が発生
say_hello(); //=> 警告


関数から値を返すときには、return で明示する必要あり
<?php
function bar() {
1;
}

echo bar(); //=> なにも返ってこない

function baz() {
return 1;
}

echo baz(), PHP_EOL; //=> 1


変数のスコープ
<?php
$var = 'This is a global variable';

function hoge() {
echo "var is '$var'.", PHP_EOL; // $var is undefined
$var = 'This is a local variable';
echo "var is '$var'.", PHP_EOL; // $var is defiend

// $GLOBALS 配列を通して、グローバル変数にアクセスする
echo "var is '$GLOBALS[var]'.", PHP_EOL;
//=> $global is defiend

$GLOBALS['var'] = 'Called by hoge';
}

function fuga() {
// もう一つのグローバル変数へのアクセス方法
global $var;
echo "var is '$var'.", PHP_EOL; // $var is undefined

$var = 'Called by fuga';
}

hoge();
fuga();

echo $var, PHP_EOL; //=> 'Called by fuga'

[PR]
# by fkmn | 2010-04-15 22:43 | IT
PHP の配列
PHP の配列についての、覚え書きというか書き散らし。


いきなり要素に突っ込んで、配列を作成
<?php
$vegetables['corn'] = 'yellow';
$vegetables['beet'] = 'red';
$vegetables['carrot'] = 'orange';

echo $vegetables['corn'] . '<br />';
echo $vegetables['beet'] . '<br />';
echo $vegetables['carrot'] . '<br />';


array 関数を利用 (key あり)
<?php
$dinner = array(0 => 'Sweet Corn and Asparagus',
1 => 'Lemon Chicken',
2 => 'Braised Bamboo Fungus',
str => 'Bare String Key');

echo $dinner[0] . '<br />';
echo $dinner[1] . '<br />';
echo $dinner[2] . '<br />';
echo $dinner['str'] . '<br />';


array 関数を利用 (key なし)
<?php
$dinners = array('Sweet Corn and Asparagus',
'Lemon Chicken',
'Braised Bamboo Fungus',);

echo $dinners[0] . '<br />';
echo $dinners[1] . '<br />';
echo $dinners[2] . '<br />';


key を指定せずに代入すると、配列の最後に追加される
<?php
$dinners[] = 'Added value';
$dinners[] = array('a', 'b', 'c');

echo $dinners[0] . '<br />';
echo $dinners[3] . '<br />';
echo $dinners[4] . '<br />'; //=> Array
echo $dinners[4][0] . '<br />'; //=> a


count() で配列の要素数を求める。未定義の変数に対する count() は 0 が返る。
<?php
echo count($dinners) . '<br />'; //=> 5
echo count($undefined_value) . '<br />'; //=> 0


空配列の作成
<?php
$empty_array = array();
echo count($empty_array) . '<br />'; // => 0


配列の繰り返し
<?php
echo '<table>';
echo '<tr><th>$key</th><th>$val</th></tr>';
foreach ($dinners as $key => $val) {
echo "<tr><td>$key</td><td>$val</td></tr>\n";
}
echo '</table>';


foreach 内で $key や $val を変えても、元の配列には影響しない。
元の配列を変える場合には $key をインデックスとして使う。
<?php
foreach ($dinners as $key => $val) {
if ($key % 2) {
$key = 'not influenced';
$val = 'not influenced';
}
else {
$dinners[$key] .= ' (modified in foreach)';
}
}

echo '<table>';
echo '<tr><th>$key</th><th>$val</th></tr>';
foreach ($dinners as $key => $val) {
echo "<tr><td>$key</td><td>$val</td></tr>\n";
}
echo '</table>';



foreach は、配列に追加された順番で要素にアクセスする。インデックス順でアクセスしたい場合は、for を使う。
<?php
$letters[0] = 'A';
$letters[1] = 'B';
$letters[3] = 'D';
$letters[2] = 'C';

foreach ($letters as $letter) {
echo $letter;
}
//=> ABDC

echo '<br />';
for ($i = 0, $len = count($letters); $i < $len; $i++) {
echo $letters[$i];
}
echo '<br />';
//=> ABCD


array_key_exists => キーの存在チェック。
<?php
if (array_key_exists(1, $letters))
echo 'key "1" exists in $letters. <br />';

if (array_key_exists(10, $letters))
echo 'key "10" exists in $letters. <br />';


in_array => 値の存在チェック。
<?php
if (in_array('A', $letters))
echo 'value "A" exists in $letters. <br />';

if (in_array('Z', $letters))
echo 'value "Z" exists in $letters. <br />';


2a問題に注意。in_array の判定に型を含める場合は、3番目の引数に TRUE を渡す。
<?php
$falses[] = false;
if (in_array('', $falses)) {
// ここを通る!!
echo 'value (EMPTY_STRING) exists in $falses. <br />';
}

if (in_array('', $falses, TRUE)) {
// ここは通らない
echo 'value (EMPTY_STRING) exists in $falses. <br />';
}


implode, 配列要素を文字列で連結
join , implode のエイリアス
unset , 配列から要素を削除する
<?php
echo implode(', ', $letters) . '<br />';
unset($letters[0]);
echo join(', ', $letters) . '<br />';


explode, 文字列をデリミタで分割
split , explode のエイリアス
<?php
$alphabet = 'A,B,C,D,E,F,G';
$alphabets = explode(',', $alphabet);
echo 'The second element of $alphabets is ' . $alphabets[1] . '<br />';

// デリミタに空文字列を指定すると、explode は FALSE を返す
$alphabets = explode('', $alphabet); //=> FALSE


文字列を文字に分解する場合は、pgrep_split (デリミタに正規表現を指定できる) を使う
参考: PHP: preg_split - Manual
<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);

[PR]
# by fkmn | 2010-04-12 23:55 | IT
PHP の文字列比較
一昔前に、PHP の文字列比較が話題になってたなぁ、という事を思い出したので、ググってまとめておく (「2a 問題」という名前がついているらしい)。


簡単に書くと、
if ('2a' == 2) {
 // ここ通る
}
って事らしい (・・・ゴクリ)。

とりあえずは、文字列の比較には === を使っておくのが無難そう。
ってか、この仕様、ユニットテスト書くときに問題になりそうなんだけど、どうなんだろう・・・?
[PR]
# by fkmn | 2010-04-10 22:45 | IT
PHP の真偽値
なにが true で、なにが false なのかは、あらかじめチェックしておくべきだよね、っというわけで、PHP で FALSE と判定されるのは、
  • boolean の FALSE
  • integer の 0 (ゼロ)
  • float の 0.0 (ゼロ)
  • 空の文字列、 および文字列の "0"
  • 要素の数がゼロである 配列
  • メンバ変数の数がゼロである オブジェクト (PHP 4のみ)
  • 特別な値 NULL (値がセットされていない変数を含む)
  • 空のタグから作成された SimpleXML オブジェクト
PHP: 論理型 (boolean) - Manual
だそうです。

まぁ、特に問題なさそう。一番最後のものが、ちと謎だけどw。
[PR]
# by fkmn | 2010-04-09 22:56 | 日記
PHP 始めてみた
今後の仕事で必要になりそうなので、「初めてのPHP5」を片手に、PHP を始めてみた。

というわけで、お約束のHello, World!!
<!DOCTYPE html>
<html>
<head><title>PHP says hello</title></head>
<body>
<b>
<?php
print "Hello, World!!";
?>
</b>
</body>
</html>
実行結果

お手軽度はかなり高い印象。ただ、キーワードと関数名が case insensitive っていうのはマジデスカ?
ちょっと不安だぜ、PHP。
[PR]
# by fkmn | 2010-04-08 22:59 | IT


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX