私がやりたいことはこれです:
{myfunc myattribute=new MyClass('arg1', 'arg2')}
しかし、試してみると、関数 MyClass が定義されていないというエラーが表示されます。
私が使用してきた回避策は、次のようなトップレベル関数を作成することです。
function MyClass($arg1, $arg2) { return new MyClass($arg1, $arg2); }
次に、テンプレートで次のことを行います。
{myfunc myattribute=MyClass('arg1', 'arg2')}
しかし、Smarty と対比させたいすべてのクラスに対して新しいトップレベル関数を作成しないようにする方法はありますか?
クラスの名前だけを取って任意のクラスを構築できる関数を作成することもできると思いますが、それは一種の醜い解決策です。
編集: 私のベスト プラクティスに違反していると言っている皆さん、おそらくこれで気分が良くなるでしょう:
私が構築しているオブジェクトは、いくつかの html をレンダリングするウィジェットです。実際のコードは次のようになります。
{render_widget widget=new MyWidget() id="myid" name="myname"}
また、残念ながら私は現在 PHP 5.2 で立ち往生しているため、クロージャーを使用できません。現在 Smarty 3.0 のバージョンを使用していますが、Smarty3 の最新バージョンを使用できます。