1つのファイルにインクルードをアセンブルするためのPHPクラス

PHPトピックのmocksoul コメントに基づく:Zend Frameworkの概要



問題



要するに、フレームワークの欠点の1つは「1つのクラス-1つのファイル」という概念であると言われていました。 私の観点からは、これはZFアーキテクチャの欠点ではありませんが、PHPの欠点です。 問題は、PHPが何十、何百ものファイルを含むようになり、それらを一度チェックすることから始まります。



提案されたソリューションは、すべてのインクルージョンを1つのファイルにアセンブリすることです。 以下に示すクラスは、問題に対する最終的な普遍的な解決策ではありません。 これには、組み込みメソッドの1つが示されています。 この場合、フレームワークファイルのみを収集し、他のファイルはすべて無視します。



クラス



<?php

クラスZendMake

{

/ **

*コメント、require / includeなどを削除して暗号化ファイルを組み立てる

*

* param string $ destコンパイルされたファイルの絶対名

* param string $には、構築するZFファイルの配列が含まれます

*配列を返す

* /

パブリック静的関数make($ dest、$ contains = null)

{

$ includes = is_array($ includes)? $には以下が含まれます:self :: _ getZendIncludes();



//タグを削除します '<?Php' '? > '、コメント、空の文字列プリミティブおよびrequire / include [_once]

$ pattern [] = '%(^ \ <\?php | \?\> $)%m';

$置換[] = '';

$ pattern [] = '%/ \ *。*?\ * /%sm';

$置換[] = '';

$ pattern [] = '%//。* $%m';

$置換[] = '';

$ pattern [] = '%(require_once | include_once | require | include)[( "\'](。*?)[)" \ '];%sm';

$置換[] = '';

$ pattern [] = '%(\ n){2、}%';

$置換[] = "\ n";



$ body = "<?php \ n";

foreach($には$ fnameが含まれます){



$ body。= preg_replace($パターン、$置換、file_get_contents($ fname、true));

}



$サイズ= file_put_contents($ dest、$ body);



return array( 'includes' => $ includes、 'compiledBody' => $ body、 'compiledSize' => $ size);

}



/ **

*プロジェクトにロックされた一意のZFファイルを選択する

*

*配列を返す

* /

プライベート静的関数_getZendIncludes()

{

$必須=配列();

$ included_files = get_included_files();

foreach($ included_files as $ fname){

if(!(strpos($ fname、 'Zend')> 0)||(strstr($ fname、__CLASS__。 '.php'))){

続ける;

}



$必須[] = str_replace( '\\'、 '/'、substr($ fname、strpos($ fname、 'Zend')、strlen($ fname)));



//すべてが必要

$ pattern = '%(require_once | include_once | require | include)[( "\'](。*?)[)" \ '];%sm';

preg_match_all($パターン、file_get_contents($ fname)、$ポケット);



$ required = array_merge($ pocket [2]、$ required);

}



return array_unique($が必要);

}

}





使用する



スクリプトの最後に行を挿入します

'ZendMake.php'が必要です;

$ result = ZendMake :: make($ libDir。 'Zend.Make.php');

Zend_Debug :: dump($ result ['includes']);

Zend_Debug :: dump($ result ['compiledSize']);





結果



このクラスを使用して、プロジェクトから60を超えるZFファイル(モジュールコントローラー、セッション、認証、ビュー、Uri、DB、構成、バージョン、デバッグ、レジストリ)を収集しました。 収集されたファイルは231 kbかかりました。



アセンブルされたファイルを使用するスクリプトの実行時間は、8回を超える多数のインクルージョンを使用するスクリプトよりも高速です。



All Articles