PHP:関数によって返される配列

私はPHPが好きです(もし気に入らない場合は、このトピックを忘れてください。チートする必要はありません)。



superFunction(foo, bar)[2];









このコードは何をしますか? そう! 配列の3番目の要素を返します。これは、引数fooおよびbarを使用してsuperFunction()を返します。



PHP構文では、これは次のようになります。



superFunction($foo, $bar)[2];









それは、このコードがParse Errorをスローするだけです。 「そして、そうです!」-構文糖に対する嫌悪の叫びはすでに聞かれています。 私は、彼らがこのトピックから離れて、それが不要であり、それが必要でないことを証明しないようにすることをお勧めします(結局私が投稿したブログを見てください)。



PHPサイトで、バージョン6でも開発者がそのような構文を許可する予定がないことを知りました。 まあ、いまいましい。 私自身-よくやった! そのため、一晩で小さなクラスを作成しました。これを正しく使用すれば、人間の方法で配列を操作できます。







これは機能しますか?





はい、プリパーサーは機能します。 数時間のデバッグの後、私は彼に失敗しないように教え、Zend Frameworkと何千ものことを続けて使用して、私の「大きな」アプリケーションの1つを処理しました。 これにより、デフォルトではバグが発生しないと結論付けています。

速く動作します。 はい、接続された(インクルードなど)ファイルをすべて解析し、必要に応じてすべてを変更します。 ただし、プリパーサーはもちろん、キャッシュされたコードを慎重に処理し、スクリプトを再度実行するときに通常のインクルードに接続します。これにより、余分なプロセッサー時間はまったく消費されません。 ちなみに、プリパーサーはファイルの変更日をチェックするため、変更された行ごとにキャッシュをクリアする必要はありません。

すでに解析されたファイルは、パフォーマンスを低下させることなくfunc()[]コンストラクトを実行します。 ひどいことはまったくありません:)



簡単に機能します。 Preparserの巨大で大規模なアプリケーション全体を簡単に取得して翻訳するには、2行を書く必要があります。 インクルードのグローバル変数を変更してプログラムを作成する場合、もう少し行を追加する必要があります。 しかし、あなたは大人であり、そのようなことを長い間行っていませんよね?

ところで、include-sからのグローバル変数は変更を停止しますが、$ smthを返します。 動作し続けます。

また、Zend_Viewとの互換性のために、これはクラス内に含まれるすべてのファイルで引き続き機能します。

したがって、Zend Frameworkを使用して記述すれば、すべてがうまくいきます。 グローバル変数のようなさのない他の市民フレームワークがある場合-ほとんどの場合、すべてがうまくいきます(私はそれをテストしていません、あなたのフィードバックを聞いてうれしいです!) そうではないにしても、わかりません。とにかく試してみる価値はあります。簡単だからです。 同時に私が間違っていることを教えてください:)



そうそう、プリパーサーにはPHP 5.3が必要です。 :)



チョーどう?





プリパーサーは、プリパーサーを介して組み込まれているファイル、およびそれを介して組み込まれているファイルに組み込まれているファイルを処理します。 おそらく、あなたは前のフレーズを理解していなかったでしょう。 わかった



オプション1:遊ぶ




本質はこれです:phpファイルでfunc()コンストラクト[2]を使用するには、プリパーサー経由で接続する必要があります。 つまり、たとえば、index.phpとhooray.phpを作成します。

<? // index.php



// include_path()

require_once '/library/Preparser.php';



// , . !

Preparser\setCachePath('/../data/preparserCache/');



Preparser\requirePreparsed_once('hooray.php');









hooray.phpでは、最も怖い構成を使用できます(/tests/dereferencing.phpに例を見つけることができます)。



<? // hooray.php



assert( array('a' => 1, 'b' => 2)['a'] == 1 );



function ret_anything($lol) {

return $lol;

}



assert( ret_anything( array(1, 2, ret_anything(4), ret_anything(array(1, 2, 3))[1])[ ret_anything(array(1, 2, 3))[ret_anything(array(1, 2, 3))[1]] ]) == 2 );











オプション2:プロジェクトをPreparserに転送する




これは、1つのクールなサイトのindex.phpを変更した方法です。

<?

// set_include_path()



require_once '/Preparser.php';

Preparser\setCachePath(APPLICATION_PATH . '/../data/preparserCache/');



//: require_once 'Zend/Application.php';

Preparser\requirePreparsed_once('Zend/Application.php');



// Create application, bootstrap, and run

$application = new Zend_Application(

APPLICATION_ENV,

APPLICATION_PATH . '/configs/application.ini'

);



$application->bootstrap()

->run();









2行追加してから1行変更しました。 とても難しい! 次に、ブラウザでindex.phpを開き、キャッシュが形成されるまで(十分な時間、ほぼ1分)待機しました。 その後、すべてが迅速かつ正常に機能しました。



落とし穴?





どのような落とし穴があるのか​​わかりません。 私は慎重に仕事をしようとしました。 グローバル名前空間は詰まりません。 新たにプラグインされたファイルは、ギフトとして変数の束を受け取りません。おそらく$ thisを除いて、単一の変数を受け取りません。 さて、あなたはまだグローバル変数をグローバルディレクティブに接続することができます。



これらの石は私よりも早く見つかると思います-あなたのフィードバックを聞いてうれしいです!



入手先





そして、 Google Codeからこの迷いを取ります 。 オープンソース。 新しいBSDのライセンスを取得しました。詳細には触れませんでしたが、必要に応じて使用でき、同時にコードを開く必要はないようです:)



マニュアルを開始することすらまだありません。 誰かがそれを書くのを手伝ってくれたら嬉しいです...



どうやって手伝う?



...はい、誰かがマニュアルの作成などを手伝ってくれたら嬉しいです。 私は英語をとても上手に話せないので、README.txtとHOWTOS.txtに書いたすべてのことを少し恥ずかしく思います。 私はそこの間違いの修正にも感謝しますが、1つの要求があります:これらの同じコメントを一時的で意味のないメッセージで散らかさないように、工場のコメントにそれらについて書いてはいけません。 preparser@va1en0k.netなど、さまざまなメールがあります



また、テストに感謝します。 さて、特にパッチについては。



機能クエストが必要です。 PHPパーサーから学ぶべきことがまだたくさんあると思います。



ご清聴ありがとうございました!



もちろん、私は退屈からこれを行いました。存在の必要性に対する支持や正当化を約束するものではありません8)



All Articles