PHP - (2008/05/21 (水) 12:49:16) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
**Tips
*** ユーザ関数の引数を参照渡しで呼び出す
call_user_func では引数を参照渡しできない。~
なので、call_user_func_arrayの第二引数へ参照を含む配列を渡す。~
#codehighlight(PHP){{
function bbb(&$str)
{
$str = 'bbb';
}
$str = 'aaa';
call_user_func('bbb', $str);
echo $str; // aaa : call_user_funcは参照を引数に取れない
call_user_func_array('bbb', array($str));
echo $str; // aaa : 参照の配列を渡していない
call_user_func_array('bbb', array(&$str));
echo $str; // bbb : OK
}}
----
*** 連想配列と配列を区別する
#codehighlight(PHP){{
function is_assoc($array) {
return array_keys($array) !== range(0, count($array)-1);
}
}}
----
*** マルチバイト対応 json_encode
#codehighlight(PHP){{
function mb_json_encode($value) {
if(is_array($value)) {
if(is_assoc($value)) {
$ret = array();
foreach($value as $k=>$v) {
$ret[] = mb_json_encode($k).':'.mb_json_encode($v);
}
$ret = '{'.implode(',', $ret).'}';
} else {
$ret = array();
foreach($value as $v) {
$ret[] = mb_json_encode($v);
}
$ret = '['.implode(',', $ret).']';
}
} else if(is_object($value)) {
$ret = mb_json_encode(get_object_vars($value));
} else if(is_string($value)) {
$ret = '"'.str_replace('"', '\\"', $value).'"';
} else {
$ret = json_encode($value);
}
return $ret;
}
}}
#contents
----
**Tips
*** ユーザー関数の引数を参照渡しで呼び出す
call_user_func では引数を参照渡しできない。~
なので、call_user_func_arrayの第二引数へ参照を含む配列を渡す。~
#codehighlight(PHP){{
function bbb(&$str)
{
$str = 'bbb';
}
$str = 'aaa';
call_user_func('bbb', $str);
echo $str; // aaa : call_user_funcは参照を引数に取れない
call_user_func_array('bbb', array($str));
echo $str; // aaa : 参照の配列を渡していない
call_user_func_array('bbb', array(&$str));
echo $str; // bbb : OK
}}
----
*** ユーザー関数の引数を連想配列で呼び出す
PHP5以上
#codehighlight(PHP){{
function call_user_func_assoc($func, $array) {
$reflect = NULL;
if(is_array($func)){
$reflect = new ReflectionMethod($func[0], $func[1]);
$func_name = (is_object($func[0]) ? get_class($func[0]) : $func[0]).'::'.$func[1];
} else {
$reflect = new ReflectionFunction($func);
$func_name = $func;
}
$args = array();
foreach ($reflect->getParameters() as $i => $param){
$pname = $param->getName();
if(isset($array[$pname]) || array_key_exists($pname, $array)){
$args[$i] = $array[$pname];
} else if ($param->isDefaultValueAvailable()){
$args[$i] = $param->getDefaultValue();
} else{
trigger_error("call to {$func_name} missing parameter nr. ", $i+1, E_USER_ERROR);
$args[$i] = null;
}
}
return call_user_func_array($func, $args);
}
}}
----
*** 連想配列と配列を区別する
#codehighlight(PHP){{
function is_assoc($array) {
return array_keys($array) !== range(0, count($array)-1);
}
}}
----
*** マルチバイト対応 json_encode
json_encodeはUTF-8のみ対応。~
その場合、マルチバイト文字列はu~に変換される。
#codehighlight(PHP){{
function mb_json_encode($value) {
$ret = null;
if(is_array($value)) {
if(is_assoc($value)) {
$ret = array();
foreach($value as $k=>$v) {
$ret[] = mb_json_encode($k).':'.mb_json_encode($v);
}
$ret = '{'.implode(',', $ret).'}';
} else {
$ret = array();
foreach($value as $v) {
$ret[] = mb_json_encode($v);
}
$ret = '['.implode(',', $ret).']';
}
} else if(is_object($value)) {
$ret = mb_json_encode(get_object_vars($value));
} else if(is_string($value)) {
$ret = '"'.str_replace('"', '\\"', $value).'"';
} else {
$ret = json_encode($value);
}
return $ret;
}
}}
----
表示オプション
横に並べて表示:
変化行の前後のみ表示: