いちばん簡単なJSON

2010.01.15    PHP, Zend Framework, 馬場   タグ: —    baba   

Ajaxを使う際、PHP側からJSON形式の値を出力したいことは良くあると思います(入力はだいたいPOSTで事足りますね)。

PHPでJSON形式の値を出力したい場合、いちばん簡単なのはjson_encode()です。

//本来はheaderなども正しく処理した方が良いが省略
$list = array('apple', 'orange', 'banana');
echo json_encode($list);

ただし、json_encode()はPHP 5.2.0以上の関数なので、それ未満の環境だとundefined functionでエラーになります。
http://php.net/manual/en/function.json-encode.php

リリース後にPHPのバージョン違いに気がついた可哀想な人には、Zend_Jsonがおすすめです。
まずはZend FrameworkのページからZend Frameworkをダウンロードします(minimalでOK)。

そして、回答したフォルダのZend/Json.phpと、Zend/Jsonフォルダをinclude_pathが通ったフォルダにコピーします。

あとは、コード内で

require_once 'Zend/Json.php';
$list = array('apple', 'orange', 'banana');
echo Zend_Json::encode($list);

とやるだけ。
関数の名前が変わるだけで、同じ使い勝手が実現できていますね。これなら一括置換も簡単。

Zend_Loaderがparent.phpを読もうとする

2009.07.29    PHP, Zend Framework, 馬場      baba   

Zend Frameworkを使い始めました。

いちいちファイルをrequire_onceするのは面倒なので、Autoloaderを使います。

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

また、Zend_Db_Tableのfindがrowsetを返すのが気にくわないため、findOne()を実装することにします。

class App_Db_Table extends Zend_Db_Table_Abstract
{
	public function findOne()
	{
		$args = func_get_args();
		$result = call_user_func_array(array($this, 'parent::find'), $args);
		return $result->current();
	}
}

parentのfindを呼ぶとき、
call_user_func_array(array(’parent’, ‘find’), $args);
とすると、E_STRICTなPHP5では、staticでない関数をstaticに呼び出したと言われてエラーになります。
なので、このように
call_user_func_array(array($this, ‘parent::find’), $args);
と呼び出すわけですが、

Zend_Loaderがあまり賢くないので、parent:: を見てparent.phpを探しに行ってしまいます

Warning: include(parent.php) [function.include]: failed to open stream: No such file or directory in …

Zendのフォーラムでも同じ症状の人がいましたが、これという解決案は見つからないみたいなので、
Zend/Loader.php:83行目
include $file

@include $file
に変えてめでたしめでたし。

なんだかなぁ。

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.