問題
要するに、フレームワークの欠点の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回を超える多数のインクルージョンを使用するスクリプトよりも高速です。