MugeSoの日記 このページをアンテナに追加 RSSフィード

2008-08-18

[][]convert from camelCase to snake_case

キャメルケースからsnake_case(アンダースコア)に変換するメモ

<?php
if($argc > 1)
echo strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), '$1_$2', $argv[1])), PHP_EOL;
?>

[][]PHP<5.3での遅延静的束縛エミュレート

PHP5.3からは遅延静的束縛(Late Static Bindings)によって子孫クラスの静的メソッドを呼び出すことができるようになった。

同じことを5.3より前のバージョン*1で行う方法

<?php
class Foo {
public static function hoge(){
        echo 'Foo', PHP_EOL;
}

public function execute()
{
        echo '-- use self --', PHP_EOL;
        self::hoge();

/* for PHP >= 5.3 (Late Static Bindings)    
        echo '-- use static --', PHP_EOL;
        static::hoge();
*/
        echo '-- use get_class --', PHP_EOL;
        call_user_func(array(get_class($this), 'hoge'));

        echo '-- use $this direct --', PHP_EOL;
        call_user_func(array($this, 'hoge'));
}
}

class Bar extends Foo {
public static function hoge()
{
        echo 'Bar', PHP_EOL;
}
}

$foo = new Foo();
$bar = new Bar();

echo '[Foo]', PHP_EOL;
$foo->execute();

echo '[Bar]', PHP_EOL;
$bar->execute();

?>

*1:PHP5.2とか

2008-08-11

[][]Agavi-1.0BETA1リリース

ついに1.0系が来ました。とりあえずBETA1です。では早速アナウンスメール邦訳です。(一部、文が長かったので箇条書きに改めてあります。)

こんにちは皆さん。

3年強の開発の末、Agaviはついに最初の1.0マイルストーン 1.0.0 beta 1のリリースを迎えました! http://agavi.org/ で手に入れてください。

おそらくご存知のように、このリリースはAgavi 0.11シリーズ安定版とほとんど同一です。0.11シリーズは長らく製品利用可能な状態であり、既に多くのサイトで幅広く利用されていると思います。

このリリースは新しいプロジェクトビルドシステムと、後方互換性を保ちながらより柔軟性を増し将来に備えた新しいXML設定サブシステムを導入しています。その他幾つかの改良も以下に列挙しますが、いつものようにRELEASE_NOTESとCHANGELOGファイルにすべて書いてあります。また、UPGRADINGドキュメントにも特別な注意を払ってください。設定ファイルのフォーマットの相違点について説明しています(しかしながら、古い設定ファイルも続けて利用できます)

アプリケーション用ユニットテストサブシステムなど、2,3の処理すべきリファクタリングが残っているのでリリース候補サイクルに入る前に、もう一つベータリリースが予定されています。現在、製品環境での利用は推奨されないことを覚えて置いてください。

また、喜ばしいことに新しいチュートリアルマニュアルのプレビュー版がhttp://agavi.org/docs/tutorial/にアップされました。これは、新しい公式Agaviデモアプリケーションの作成と改良について説明する多くの章のうち最初の数章です。デモアプリケーションは他のマニュアルやプレゼンテーションあるいはトレーニングにおいても利用されることになるでしょう。どうかご覧になって意見を聞かせてください。どんなフィードバックでも大歓迎です。

では、1.0における3つの重要な新機能について述べます:

XML設定サブシステムは次の改良がなされました

  • 名前空間が有効なハンドラ
  • 複数のXMLスキーマをサポート
  • 設定解析の様々な場面でのRELAX NGとSchematronによるバリデート
  • 外部命令や処理命令を通したXSLのサポート
  • 名前空間バージョニングのサポート これは将来も設定ファイルに高い後方互換性を持つことを意味します
  • envelope名前空間と実際の内容の名前空間が分けられました(これはUPGRADINGドキュメントでも述べています)

あなたのプロジェクトの作成管理のための一新されたビルドシステム

新しいビルドシステムは対話式の入力を伴わず働く生のターゲットだけでなく、幾つかのウィザードを持っています。これによりビルド操作の拡張およびカスタマイズをbuild.xmlファイルで行うことができます。また更なる柔軟性のためイベントリスターシステムも存在し、あなたはフックすることができます。

実行コンテナ(Execution container)がリクエストメソッドを持つようになりました

これにより、例えば、リクエストメソッドを"read"に強制したログインフォームを伴ったスロットを埋め込むことができます。すると例えそのページに対して他のフォームからPOSTメソッドによるリクエストが投げられても、もはやアクションはログイン動作を実行することはありません。これは厳重にコンポーネント化されたウェブサイトを構築する際に人々が経験してきたリクエストメソッドに由来する多くの苦痛を軽減するでしょう。

RELEASE_NOTESやCHANGELOG UPGRADINGで述べているように、残りはほとんどリファクタリングとちょっとした改良です。

ぜひ、あなたのプロジェクトでこの最初のリリースをとことんテストしてください。そして発見した問題をメーリングリストバグトラッカーに報告してください。

Agaviを使ってくれてありがとう、そのようなユーザー基盤の元で働けることは本当にうれしいです!

Many greetings,

David

2008-08-08

[]「?:演算子」使える場面Part2

Doctrineは検索結果が0件の場合falseを返してくることを思い出した。ということはこれだ

<?php
$user = Doctrine::getTalbe('User')->find($user_id, Doctrine::FETCH_ARRAY) :? array('user_id'=>'anonymous');
?>

[]PHP4お疲れ様

今日でEOLを迎えたPHP4 今までありがとう。

<?php
class PHP4 {
  function PHP4()
  {
    return new PHP5();
  }
}
?>

[]「?:演算子」使える場面だってあるさ!

そろそろそろそろ「?:演算子」について一言言っておくかに一言言っておくか

最近、配列で利用する可能性のあるキーすべてをとりあえず初期化するようにしている。

<?php
$_GET += array(
  'user_id'=>null,
  'enable_hoge'=>false,
  'name'=>'nobody'
);
?>

なので、

<?php
$user_id = $_GET['user_id'] ? : 'anonymous';

だがちょっと待って欲しい。それなら最初から

<?php
$_GET += array(
  'user_id'=>'anonymous',
  'enable_hoge'=>false,
  'name'=>'nobody'
);
?>

でいいじゃないか、と思った。

でも、こういうのもありうる。

<?php
class Foo {
  protected $cfg = array();
  
  public function __construct(array $config = array())
  {
    $config += array(
      'user_id'=>'anonymous',
      'enable_hoge'=>false,
      'name'=>'nobody'
      );
    $this->cfg = $config;
  }

  public function setConfig($key, $value)
  {
    $cfg[$key] = $value;
  }

  public function getUserId()
  {
    $user_id = $cfg['user_id'] :? 'anonymous';
    
    return $cfg['user_id'] :? 'anonymous';
  }
}

$foo = new Foo(array('user_id'=>'hoge');
echo $foo->getUserID(), PHP_EOL;
$foo->setConfig('user_id', null);
echo $foo->getUserID(), PHP_EOL;

/*
result:
hoge
anonymous
*/
?>

[]MobilePictogramCoverterを使おうと思った

MobilePictogramConverterを使おうと思った。ブログで報告されているバグがあるようなので修正してた。

それとPHP5的にグローバル定数ってどうなのよってことで、グローバル定数をMobilePictogramConverterクラスに取り込んでみた。

そして今、修正版を公開してみるMobilePictogramConveterExt

クラスを参照渡ししていた個所を修正して、メソッドにpublicを追加

というか内部で定数使ってる部分修正してなかった=動かなかった

MobilePictogramConveter PHP5対応版を更新参照

2008-07-28

[][]slotから外側のviewにお伝えしたいことがある。

slotとして呼び出されたviewやテンプレートから外側のviewのattributeあるいはテンプレート変数に値を入れたい。具体的にはcssやjavascriptを指定したい。javascriptはbody内でも呼び出せるけどできればヘッダに配置したほうがきれいじゃない。あと同じの2回呼び出したくないし。

どうしよう。どうするのがベストだろう。responseに何か仕掛けるべきか。

2008-07-14

[][]$view->setAttribute('_title', 'タイトル')をテンプレートで呼び出す

Agavi-0.11系でテンプレートから$viewを使えるように設定している場合、$view->setAttribute()を呼び出すことでそれ以降に呼び出されるレイヤでそのアトリビュートが有効になり$templateからアクセスできるようになる。

これを使うとデコレータで用いるMasterテンプレートで

<head>
  <title><?php echo $template['_title'], ' - ', AgaviConfig:get('core.app_name'); ?></title>
</head>

に対してアクション用のhogeSuccess.php

<?php $view->setAttribute('_title', 'ページタイトル');?>

することによって、いい感じになる。

また、Masterテンプレートに先日紹介したstyle_sheetを読み込む仕掛けがある場合、あるテンプレートで必要とされるスタイルシートを追加することも簡単。

<?php $view->appendAttribute('style_sheets', 'modpub/Foo/bar.css');?>