問題タブ [spl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - SPL自動読み込みのベストプラクティス
サーバー側のinclude_pathには、「/ usr / share /pear/」にあるpearディレクトリへの参照があります。私のアプリケーションには、「/ usr / share / pear /library/」にある共通ライブラリのファイルを含めていますrequire_once 'library/file.php'
。
最近、splオートローダーの使用を開始しました。ローダー関数で、ファイルを含めるロジックを決定する必要があることに気付きました。これを行う最初の方法は、ファイルをインクルードし、@
それが失敗するかどうかを確認するためにそれを抑制することでした。たとえば、悪い習慣であること@include 'library/file.php'
について多くのことを読んだことが主な理由で、そして、ディレクトリが私が望むものであるかどうかを確認し、それを実行してそれを含めます。@
get_include_path
PATH_SEPARATOR
file_exists
そのようです:
私は間違ったルートに行きましたか?私はちょうど@include
ビジネスをするべきでしたか、それとも私はそれをいくらか正しい方向にやっていますか?
php - デフォルトのハッシュの代わりにphpでキーの重複を使用してデータ構造を作成するにはどうすればよいですか?
ラッパークラスを作成したいのですが、デフォルトのハッシュでは許可されていませんが、キーの複製が有効になります。クラスはphp5で導入されたメンバーのオーバーロードメカニズムを使用する必要があるため、標準ハッシュのすべての動作を模倣します。たとえば、私は次のようなsmthが欲しい
$ var ['mykey']を取得する場合は、array('val1'、'val2')を返す必要がありますが、objを新しい'mykey' =>'value'ペアで拡張する場合は、
主なアイデアは、ハッシュの動作が保持され、既存のキーの使用に値を割り当てようとした後、上書きされずにリストに追加されるというものです。
php5(5.3より前)の他のデータ構造をどのように模倣しますか?共有したい既知の解決策や例はありますか?
php - PHPイテレータで選択したフォルダのみを実行するにはどうすればよいですか?
PHP再帰ディレクトリイテレータを使用してphpファイルとhtmlファイルを検索し、それらを日付別に一覧表示しようとしています。使用されるコードは次のとおりです。
上記は機能しますが、反復を特定のフォルダーに制限する必要があります。このスクリプトは、「administrator」、「components」、「modules」、「plugins」、「templates」などの特定のサブフォルダー(つまり、Joomlaインストールの標準フォルダー)が必要な親フォルダーで開始されます。また、「index.php」のように、親フォルダーにいくつかのファイルがあることを期待しています。これらのファイルとフォルダーは反復する必要があります(率直に言って、これを書くと、親フォルダー自体が私のコードによって反復されているかどうかはわかりません!)。ただし、親フォルダーに、反復してはならない他のサブフォルダーが含まれている可能性があります。これらは、「mysub」や「myaddon.com」などの名前のサブドメインまたはアドオンドメインのサブフォルダーである可能性があります。通常のJoomlaインストールフォルダ以外のフォルダをスキップしたい理由は2つあります。1つは、他のフォルダー内のファイルについて知る必要がないことです。さらに、すべてのフォルダーを繰り返すと、500のエラーページが表示されるほど多くの時間とリソースがかかる可能性があります。
私の質問は、適切なフォルダーがイテレーションから除外され、イテレーションに含まれるようにするために、コードをどのように変更するのが最善かということです。Webでディレクトリの名前をチェックするイテレータの例を見てきましたが、2番目のレベルのフォルダ名(parent / secondlevel / noneedtocheckなどのパスの最上位のサブフォルダのみを意味する)をチェックするだけでよいため、十分に役立ちません。 /file.php)。
php - RegexIterator :: REPLACEモードの操作方法は?
私のコードの何が問題になっていますか:
イテレータが空です、なぜですか?ご協力いただきありがとうございます!
php - PHPで一貫性のないDirectoryIterator + FilterIteratorの動作?
標準 PHP ライブラリ (SPL) の FilterIterator クラスを使用するスクリプトを作成しましたが、PHP 5.x バージョン間で異なる動作が得られます:( ここでは、accept() 関数:
PHP 5.3.1 の出力は次のとおりです。
そして、PHP 5.2.5で同じコードを使用して得られるものは次のとおりです
後者には、すべてのファイルに対するパーミッション 755 があります。どうしたの?
php - (構文ツリー) 現在のトップダウン パスを使用してツリーをボトムアップで再帰的に反復する
反復する必要がある抽象構文ツリーがあります。AST は、 PHP へのレモン ポートによって生成されます。
さて、「通常」、私は真新しくてピカピカの (PHP 5.3.1) SPL クラスでそれを行います。それは次のようになります:
実際、これはツリー全体の大まかなタイプを決定するコードの別の部分で既に行っていることです (つまり、代入、条件などである可能性があります)。詳細はさておき、唯一重要なことは、反復が RecursiveIteratorIterator::SELF_FIRST、つまりトップダウンで行われることです。
私の問題に戻ると、ツリーでいくつかの置換と最適化を行うために、AST ボトムアップ、つまり RecursiveIteratorIterator::CHILD_FIRST のようなものを繰り返す必要があります。
問題は、これらの操作がコンテキストを認識している必要があることです。つまり、現在のノードまでのパスが必要です。そして、ボトムアップで反復したいので、RecursiveIteratorIterator ではそれができません。
ちょっと考えてみてください。ボトムアップを反復し、各反復で現在のノードのトップダウン コンテキスト (スタック) を取得したいと考えています。RecursiveIteratorIterator は逆方向に反復するために、最初にツリーの末尾に移動する必要があるため、技術的には可能であるはずです。末尾に向かう途中で、現在の位置をキャッシュし、再帰から戻るときに要素を単純にポップアウトすることができます。
これはキーワードです: caching。これが、別の SPL クラス RecursiveCachingIterator で可能であると思われる理由です。
問題は、それは本当に可能かということです。はいの場合、どのように?
私はいくつかのコードでパズルを解こうとしましたが、成功しませんでした。ドキュメントはほとんどありません。本当に、本当に希少です。
SPL を使用してこれに対する最もエレガントなソリューションを見つけた人は誰でも脱帽です! あなたはPHPの第一人者です!
PS: 不明な点がある場合は、できるだけ多くの SPL (再) 使用法を探しています。カスタム スタックを使用して独自の再帰関数を記述できることはわかっています。そのことを思い出させる必要はありません。
php - PHP DirectoryIterator ヘルプ
次のコードでは、? の代わりに何を呼び出すことができます->getFilename()
か?
PS、ドキュメントを見ました。ここ に リンク しない でください.
助けてくれてありがとう。
編集:
これを投稿した後、ドキュメントに答えがあることに気付きました。私の本当の質問は、他の方法は何をするのですか? ドキュメントはそれに関して制限されているようです。
php - オブジェクトを配列として使用する
最近の PHP の更新では、ArrayAccess、Iterator、Countable など、オブジェクトを配列として扱えるようにするさまざまなインターフェイスが追加されました。
私の質問は、次のことが機能することは理にかなっているでしょうか。
$array
現時点では、技術的には配列ではないため、PHP は型ヒント エラーをスローします。ただし、基本的に配列と同じにするすべてのインターフェイスを実装しています。
論理的には、オブジェクトは配列と同じインターフェイスを実装しているため、配列を使用できる場所ならどこでも使用できるはずです。
私の論理は混乱していますか、それともオブジェクトが配列と同じインターフェイスを実装している場合、それはすべて同じ場所で使用できるべきであるということは理にかなっていますか?
php - PHP < 5.2 の場合は spl_object_hash (オブジェクト インスタンスの一意の ID)
PHP 5+ でオブジェクト インスタンスの一意の ID を取得しようとしています。
関数spl_object_hash()
は PHP 5.2 から利用できますが、古い PHP バージョンの回避策があるかどうか疑問に思っています。
php.net のコメントに関数がいくつかありますが、うまくいきません。最初の(簡略化):
はネイティブ オブジェクト (DOMDocument など) では機能しません。
それは主要なパフォーマンスバスターになる可能性があるようです!
誰かが何かを持っていますか?
php - 配列表記を使用してオブジェクトのプロパティにアクセスできるようにする PHP インターフェイスはどれですか?
オブジェクトがこれを行うことを許可する PHP SPL インターフェイスは次のうちどれですか。
例えば、Doctrine (Doctrine_Record) のようなライブラリのように
どうすればこれを実装できますか? ArrayObject を使用してみましたが、思ったように動作しません。
すなわち
編集:
Arrayable と呼ばれるベアボーン実装を試しました。