チェックアウトプロジェクトがために、以下の方法が含まれていることをhttp://phpviewengine.codeplex.com/
PHPスクリプトが使用できる形式にCLR型を変換する:
object PhpSafeType(object o)
{
// PHP can handle bool, int, double, and long
if ((o is int) || (o is double) || (o is long) || (o is bool))
{
return o;
}
// but PHP cannot handle float - convert them to double
else if (o is float)
{
return (double) (float) o;
}
// Strings and byte arrays require special handling
else if (o is string)
{
return new PhpString((string) o);
}
else if (o is byte[])
{
return new PhpBytes((byte[]) o);
}
// Convert .NET collections into PHP arrays
else if (o is ICollection)
{
var ca = new PhpArray();
if (o is IDictionary)
{
var dict = o as IDictionary;
foreach(var key in dict.Keys)
{
var val = PhpSafeType(dict[key]);
ca.SetArrayItem(PhpSafeType(key), val);
}
}
else
{
foreach(var item in (ICollection) o)
{
ca.Add(PhpSafeType(item));
}
}
return ca;
}
// PHP types are obviously ok and can just move along
if (o is DObject)
{
return o;
}
// Wrap all remaining CLR types so that PHP can handle tham
return PHP.Core.Reflection.ClrObject.WrapRealObject(o);
}
それは
...このように使用することができます
// Get setup
var sc = new ScriptContext.CurrentContext;
var clrObject = /* Some CLR object */
string code = /* PHP code that you want to execute */
// Pass your CLR object(s) into the PHP context
Operators.SetVariable(sc,null,"desiredPhpVariableName",PhpSafeType(clrObject));
// Execute your PHP (the PHP code will be able to see the CLR object)
var result = return DynamicCode.Eval(
code,
false,
sc,
null,
null,
null,
"default",
1,1,
-1,
null
);
これは匿名の型を扱うこともできます。たとえば、次のように挿入します。
var clrObject = new { Name = "Fred Smith" };
Operators.SetVariable(sc,null,"person",PhpSafeType(clrObject));
その後、PHPでこれをアクセスすることができ
:答えトマスのためのコース出力の
echo $person->Name;
Fred Smith
おかげで、私はラウンドそれを他の方法を行うことを期待していた。持っています.NETコードはPHPスクリプトを呼び出し、パラメータを渡すことで自動的に "$ categories"のようなバインディングを作成して、書かれた "php .net"コードの量を最小限に抑えます。これは可能ですか? – Robert
@ロバーツ:はい、そうする方法もあります(詳細を確認する必要があります)。質問は、PHPコードをどのようにインスタンス化したいのですか? ASP.NET MVCを使用している場合は、 'return PhpView(" foo.php ")'のようなものをコントローラに入れたいと思っていますか? (現在、これはサポートされていませんが、面白く聞こえるかもしれません。) –
私はビューを呼び出す独自のF#ishの方法を持っているフレームワークのような私自身のmvcを持っていますが、基本的にはPHPのビューを呼び出すためのリターンPhpView( "foo.php")のようなものです。私は今それを見てきました。スクリプトのコンパイルに関連するすべてのものが内部としてマークされているので、難しいようです。 phalangerのカスタムビルドを行い、いくつかの可視性の設定を変更する必要があるように見えます。 – Robert