3

Templateビューとそれに関連するデータを管理するためのクラスを作成しました。とを実装IteratorArrayAccess、次のように簡単に使用できるように「サブテンプレート」を許可します。

<p><?php echo $template['foo']; ?></p>
<?php foreach($template->post as $post): ?>
    <p><?php echo $post['bar']; ?></p>
<?php endforeach; ?>

hash()とにかく、やなどのインラインコア関数を使用するのではなく、テンプレートに格納されているデータのラッパーとして機能する、date()というクラスを作成すると便利だと思いました。TemplateData

このようにして、フォーマットの一般的な方法のリストを追加できます。次に例を示します。

echo $template['foo']->asCase('upper');
echo $template['bar']->asDate('H:i:s');
//etc..

$template['foo'] = 'bar';コントローラでを介して値を設定すると、の値はそれ自体のオブジェクト'bar'に格納されます。TemplateData

私は魔法を使った__toString()ので、オブジェクトをエコーすると、その値TemplateDataにキャストし(string)てダンプします。ただし、マントラコントローラーとビューにもかかわらず、次のようなことを行うときはいつでも、データを変更しないでください。

$template['foo'] = 1;
echo $template['foo'] + 1; //exception

それはで死ぬObject of class TemplateData could not be converted to int; 文字列にリキャスト しない限り$template['foo']

echo ((string) $template['foo']) + 1; //outputs 2

ある種、そのフープを飛び越えなければならないという目的を打ち負かします。この種の動作の回避策はありますか?それとも、ビューでのデータ変更の偶発的な防止として、これをそのまま使用する必要がありますか?

4

3 に答える 3

1

PHPは演算子の読み込みをサポートしていません。加算(またはそのことに関して演算子に関連する他の何か)を実行できるようにしたい場合は、サポートする演算子ごとにメソッドを提供する必要があります。一般的なケースでは、基本テンプレートクラスに実装するだけで十分であり、必要に応じて後で拡張できます。オブジェクトでの使用はショートカットですが、使用(string)しないことをお勧めします。

于 2011-03-03T23:21:37.367 に答える
1

Echo は の結果をエコーし​​ようとしています$template['foo'] + 1$template['foo']は 型のオブジェクトであり、TemplateData1あるため、intエラーが発生しています。この場合、((string) $template['foo'])「再キャスト」ではなく、初めてのキャストです。

于 2011-03-03T22:47:27.767 に答える
0

実装を少し変更しましたが、当面は機能するようです。クラスに__invoke()メソッドを追加しました。このメソッドは、型キャストを必要とせずに変更せずにプロパティを返します。したがって、実際には:TemplateData$_data

//in controller
$template['foo'] = 'bar';
$template['abc'] = 123;

//in view
echo $template['foo']();                       //bar
echo $template['foo']->asHash('md5');          //37b51d194a7513...
echo $template['abc']();                       //123
echo $template['abc']() + 123;                 //246
echo $template['abc']->asHash('md5');          //202cb962ac5907...

//__invoke also takes $function and $arguments for alternative syntax
echo $template['foo']('asHash', array('md5')); //37b51d194a7513...

私はこの山を征服したので、次のステップはどういうわけか連鎖を許可することだと思います。

echo $template['foo']->asHash('md5')->asCase('upper');

しかし、それは難しいことのようです。「チェーンの状態」を追跡することは、私が以前に試したものですが、成功しませんでした。ある意味でそれはかなり簡単です(しかし厄介です)__invoke()

echo $template['foo'](
    array('asHash', 'asCase'),          //ordered array of method names
    array(array('md5'), array('upper')) //ordered array of method argument arrays
);

誰かがこれの問題、または代替アプローチの他の理由を見ることができますか?

于 2011-03-04T18:34:51.130 に答える