問題タブ [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 - OutOfRangeException と OutOfBoundsException の比較
PHP では、無効なキーに対して 2 つのSPL例外を定義しています。
OutOfRangeException
: 無効なインデックスが要求されたときにスローされた例外。これは、コンパイル時に検出する必要があるエラーを表します。
OutOfBoundsException
: 値が有効なキーでない場合にスローされる例外。これは、コンパイル時に検出できないエラーを表します。
PHP はコンパイル済み言語ではないため、コンパイル時と実行時の区別が奇妙に思えます。そのため、どの例外をいつ使用するかを理解するのが難しいと感じています。
現在、私の理解では、配列がキーとして渡された場合など、キーが根本的かつ本質的に不正な形式である場合は
...をスローする必要があります。
...キーは一般的に問題ないが、いくつかの境界内にない場合、たとえば、渡されたが最大キーである場合。OutOfRangeException
OutOfBoundsException
100
50
その理解は正しいですか?
php - 複数の spl_autoload_register
複数あることの利点は何ですかspl_autoload_register
例:
対:
1つを使用して
spl_autoload_register('autoload');
また__autoload();
次に、関数内でロジックを実行します。
php - PHPのSplObjectStorageと甘い構文
クイックワン; それが可能かどうかは疑問ですが、オブジェクトarray($key => $value);
に関してPHPの構文を利用する方法はありますか?SplObjectStorage
私が言いたいのは、達成するためのそのような方法はありますか?
オブジェクトストアを初期化するコンテキストでは?今のところ、私は単に使用しています:(そして、これが可能性であるというまったくの可能性を考慮して、おそらく継続します)
それを非常に疑って、いいでしょう、しかし多分誰かがもっとよく知っています。
php - セットに複製を追加しようとしています-どのような例外をスローしますか?
Doctrineモデルに関連オブジェクトをコレクションに追加するメソッドを作成していますが、重複するオブジェクトがそのコレクションに追加されたときに例外をスローしたいと思います。
テストは次のとおりです。
最初は、この場合にをスローするのが適切かもしれないと思いましたが、OverflowException
「この値はすでに存在します」が「このコンテナがいっぱいです」と同じかどうかはわかりません。
完全なコンテナに要素を追加すると例外がスローされます。
ありますがUnexpectedValueException
、タイプが正しくない変数に当てはまるようです。
値が値のセットと一致しない場合にスローされる例外。通常、これは、関数が別の関数を呼び出し、戻り値が特定のタイプまたは値であり、算術エラーまたはバッファ関連のエラーを含まないことを期待している場合に発生します。
私はいつでも使用できますLogicException
が、これはこのユースケースでは少し一般的なようです。
プログラムロジックのエラーを表す例外。この種の例外は、コードの修正に直接つながるはずです。
ここにもっと良い選択肢はありますか?私の観察は正しいですか?一意の値を含む必要があるコレクションに複製を追加しようとするときにスローする最も適切なSPL例外は何でしょうか。
php - SplFileObjectで行数を取得するにはどうすればよいですか?
でファイルの行数を見つけるにはどうすればよいSplFileObject
ですか?
php - array_map vs ループと操作
使用:
このような速度の違いがある理由を説明できる人もいます:
$maxHeap
オブジェクトであることclass MaxHeap extends SplMaxHeap
php - PHP spl_autoload_register()フレーバーの長所/短所
このspl_autoload_register()
関数は、関数、静的メソッド、通常のメソッドの3種類のコールバックで使用できます。これら3つのタイプの長所/短所はありますか?
php - 連想配列と SplObjectStorage
一意のオブジェクトのコレクションを管理するコードに取り組んでいます。このコードの最初のプロトタイプは連想配列を利用しています。
しかし、PHP のより新しいバージョンに追加された機能を利用することにも熱心です。たとえば、[SplObjectStorage][1]
代わりにこれを行うことです。これは、一部は学習経験として、一部は利点をもたらすはずだからです (私が見たベンチマークは、それSplObjectStorage
ができることを示唆しています)多くの場合、配列よりも高速です)。
現在の実装には連想配列がありin_array()
、新しいオブジェクトを追加する前に、オブジェクトが配列に既に存在するかどうかを確認します。
私が見ることができる大きな問題SplObjectStorage
は、(一見すると) キー/値の連想配列の動作をサポートしていないように見え、インデックス付き配列としてしか扱えないことです。ただし、PHP の新しい機能に関するドキュメントは、言語のより確立された部分のドキュメントの標準に達していないため、単に何かが欠けている可能性があります。
SplObjectStorage
連想配列の代わりに使用できますか? その場合、新しいオブジェクトを追加するときにキーを定義するにはどうすればよいですか? SplObjectStorage
さらに重要なことは、連想配列と比較した場合の相対的な長所と短所は何ですか?
php - 読み取り専用オブジェクトでtrueisWritableを返すPHPUnitおよびSplFileObject
その特定のログのファイルとして使用するコンストラクターでLogger
を受け入れるインターフェイスがあります。実際にロギングを行うために利用できる方法SplFileObject
もあります。log($timestamp, $message)
私の最初の実装では、新しいオブジェクトをインスタンス化して読み取り専用SplFileObject
の例外を渡すときに、例外がスローされる必要があります。適切な単体テストを作成しました。
通常はディレクトリ名を生成するメソッドがありますが、問題が発生し始めたときに、それを絶対パスに変更して、原因として除外しました。
そして、これが実装です:
問題は、テストに合格し、テストによって生成されたコードカバレッジによってisWritable()
trueを返しSplFileObject::fwrite()
、読み取り専用オブジェクトでもnull以外の値を返すことです。
これの本当に、本当に奇妙な部分は、単体テスト以外の例で実行されたのとまったく同じコードが、本来あるべきように失敗することです。
これをfromから実行するとindex.php
、xdebugは、渡されたファイルが書き込み可能ではないという予期されたメッセージとともに、キャッチInvalidArgumentException
されていないことを示します。FileLogger
これは完全に不可解であり、両方の状況で同じ正確なコードが実行されていますが、単体テスト内のコードは「失敗」しており、単体テストされていないコードは期待どおりに実行されています。
- はい、ファイルは存在します。
SplFileObject
そうでない場合は例外をスローします。 - まったく同じコードが両方の状況で実行されています。実行されている他のコードには、2つの定数、ファイルディレクトリとへのショートカットの
DIRECTORY_SEPARATOR
設定、およびクラスの自動読み込みの設定が含まれます。ただし、これも両方の状況でまったく同じように発生し、この単体テストが実際に実行されるずっと前に失敗する可能性があります。 - ヘルプ!
今それを見ると、問題は比較的単純に見えます。PHPは_www
ユーザーの下で実行されており、phpunitはそれをインストールしたユーザーとして実行されています。これらのユーザーにはさまざまな権限があり、これは完全に理にかなっています。どういうわけかこの問題が発生している場合は、edorianの回答を確認し、単体テストの作成方法を再評価することをお勧めします。