問題タブ [php-closures]

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.

0 投票する
2 に答える
544 参照

closures - PHPクロージャは親関数パラメータにアクセスできませんか?

私は PHP 5.3 用のコードをいくつか書いていますが、以下に示すコードと同様のことをしたいと考えていました。このコードは 'hellohello' を出力するはずですが、代わりに 'hello' を出力し、エラーが発生します。

$inner クロージャーは、外部関数のパラメーターにアクセスできないようです。これは正常な動作ですか?PHPのバグですか?それがどのように正しい動作と見なされるのかわかりません...

ありがとう!

0 投票する
1 に答える
310 参照

php - PHP5.3.2-1ubuntu4.2ではクロージャーサポートはありません

PHPの一部が、あるサーバーでは正しく実行されないが、別のサーバーでは正しく実行されることに気づきました。

どちらも、PHP PHP5.3.2でUbuntu10.04を実行しています(Suhosin-Patch(cli)を使用したPHP 5.3.2-1ubuntu4.2(ビルド:2010年5月13日20:03:45))

私は以下を使用してテストしています:

動作するサーバーでは、結果は次のようになります。

object(Closure)#1(0){}

そうでないものでは、結果は次のようになります。

不明:0

私は何が欠けていますか?

[編集]

同じファイルに2つのクロージャがあることに問題があるようです。

出力:

UNKNOWN:0
object(Closure)#1(0){}

0 投票する
1 に答える
3081 参照

php - WRITEFUNCTION コールバックを使用した並列 cURL リクエスト

これらの投稿で提案されているように、cURL 応答を制限しようとしています: Retrieve partial web page and PHP CURLOPT_WRITEFUNCTION does not appear to be working . アイデアは、コールバック関数で指定されているように、応答を 4000 文字に制限することです。

私は次の関数を書きましたが、コールバック関数定義のパラメーターは関数呼び出し内のようにループ内で変化しないため、意味がないことは既にわかっています。関数が実際に呼び出されるまでに、$key の値は固定されているため、そのインデックスへの参照は変化しません。

ループごとに新しいクロージャー関数が必要なようで、それぞれが独自の $full_length 変数を参照する必要があります。しかし、それがどのように可能かわかりません。そのためには、特定の $full_length 変数を指定するために、どうにかしてクロージャー オブジェクトへの参照を作成する必要があるようです。

どんな助けでも大歓迎です。ありがとう。

編集:

私がやろうとしていることを正確に行う投稿を見つけましたが、それは javascript にあります: for loop - callback with loop variable as parameterです。PHP で同じことを行うために、次の関数を作成しました。

コードはエラーなしで実行されましたが、それでも私が望んでいたことはできませんでした。cURL ハンドルを閉じた後、$full_length 配列をダンプしましたが、次のようにしか表示されませんでした。

これは、get_write_function によって初期化された (クラス宣言で何も初期化していないため) ことを示していますが、値はその後更新されていません。

0 投票する
1 に答える
152 参照

php - 比較/演算子ブロックをリファクタリングして DRY アップし、CRAP レベルを下げる

ジェネレーターを返す一連のクラス (php 5.5) を中心に小さなプロジェクトを作成することに着手しました。

この小さなプロジェクトの主な動機は、TDD の旅を拡張し、ジェネレーターをいじり、後で使用するために packagist に投げることができるパッケージを用意することでした。

「プロジェクト」全体の現状はGithubで確認できます

すべてのテストは緑色で、メソッドは私が望むことを行います。重複が多いので、リファクタリングしたいと思います。

このクラスには getOdd という名前のメソッドもあります (そして、そうです ;) )

主な重複はクロージャー$Generator = function() ...であり、違いは主+ - * /に for ループ内の and 引数などの演算子です。これは、クラスの残りの部分でも主に同じです。

PHP で動的比較演算子を読んだところ、次のようなネイティブ メソッドは存在しないという結論に達しました。compare(...)

比較のためにプライベート/保護されたメソッドを作成する必要があります。もしそうなら、私はこれのために新しいクラス/関数を作るべきですか? 私はそれが現在のクラスに属しているとは思わない。

これを適切な方法で乾燥させる方法がわかりません。

ところで。getEven を知っていますが、getRange With step 関数を取得したときの getOdd はちょっとばかげていますが、それはより一般的なリファクタリング/パターンの質問です。

@github を更新 して getEven と getOdd を削除しました...

0 投票する
1 に答える
1559 参照

zend-framework2 - Zend Framework 2 のファクトリ クラスとクロージャ

Zend Framework 2 では、ファクトリ クラスとクロージャのどちらを使用する方が良いですか? また、その理由は?

クロージャーをシリアル化できないことはわかっていますが、Module#getServiceConfig() からそれらを返す場合、これは構成データの残りのキャッシュに影響を与えず、クロージャーはとにかくオペコード キャッシュにキャッシュされます。

ファクトリ クラスの構築とクロージャの実行でパフォーマンスはどのように異なりますか? PHP はクロージャーを実行するときだけラップしてインスタンス化しますか?それとも、リクエストごとに構成ファイルで定義されたすべてのクロージャーに対してこれを行いますか?

各メソッドの実行時間を比較した人はいますか?

以下も参照してください。

0 投票する
5 に答える
13426 参照

php - ラムダ関数とクロージャ(PHP)の違いは?

「Magento PHP 開発者ガイド」の第 2 章には、次のように記載されています。

Zend Framework 2 は 100% オブジェクト指向のコードを使用し、PHP 5.3 の新機能のほとんど (名前空間、遅延静的バインディング、ラムダ関数、およびクロージャー) を利用しています。

「クロージャー」と「ラムダ」の違いは何ですか? いくつかの答えがあります(ラムダは単なる無名関数であり、クロージャーはパラメーターリストにない変数にアクセスできる関数であるなど)、Pythonプログラミング言語に固有のようです(Schemeについての言及もあります)プログラミング言語)。たとえば、投稿によると、Python では、ラムダではないクロージャと、クロージャではないラムダが存在する可能性があるようです。

ただし、Python ではなく PHP プログラミング言語に興味があります。以下の回答の 1 つは、PHP ではすべてのクロージャーがラムダであることを指摘しているようです。これは、Python に関する投稿の内容と矛盾します。

これらの概念は言語ごとに詳細が異なるように思われ、PHP に興味があるため、この投稿を行います。

これはすべて紛らわしいです。一般に、ラムダ関数は名前のない関数にすぎないと思いますが、次のウィキペディアの記事でクロージャーについて詳しく説明しています。

http://en.wikipedia.org/wiki/Closure_%28computer_science%29

ただし、PHP には例がありません。

0 投票する
1 に答える
80 参照

php - この場合、for ループの代わりにクロージャを使用する正当な理由はありますか?

私は Laravel 4 を使用しています。問題のモデルは拡張されEloquentます。

2 つのモデルの間に関係がlistingありphotoます。listings対応する を持たないのコレクションをコンパイルしていますphotos。Eloquent には、関連するレコードを持つレコードを見つけるための便利な方法があります。

hasメソッドの逆の存在を知りません。ある場合は、お知らせください。

とにかく、これは私が問題を解決した方法です:

これはうまくいきますが、知識を広げようとしています。collections に関する Laravelのドキュメントを読むと、コレクションをフィルタリングする例があります。

forこの方法を使用してループを書き直しました。

結果の$listingsオブジェクトはどちらの場合も同じです。どちらか一方の方法を選択する説得力のある理由はありますか、それとも単に個人的な好みの問題ですか?

0 投票する
1 に答える
918 参照

php - 追加のデータベースを使用して別のフィールドに基づいてフィールドを検証する

2 つのフィールドを含む単純なフォームがあります。最初のフィールドは単なる選択で、2 番目のフィールドには値が含まれており、最初のフィールドを使用してチェックする必要があります。

2 つのフィールドに基づく Symfony2 フォームの検証に関する同様の質問を見つけ、 Callbackバリデーターを使用しようとしました。ドキュメント
を読みましたが、データベースにアクセスして使用する方法がわかりません。

唯一の方法は検証メソッドを静的に呼び出すことのようですが、この場合、コントローラーのコンテキストが失われます。たとえば、データベースにアクセスするために必要です。
この関係で、私は Silex を使用しており、Silex が提供するサービスにアクセスしたいと考えています。

フォームはどのクラスにもマップされていないため、他のフィールドをバリデーターに渡す方法が見当たらないため、独自の制約を作成するのは間違っているように見えます。

それを達成する方法はありますか?

または、別のアプローチが必要ですか?

0 投票する
0 に答える
178 参照

javascript - PHPクロージャ関数:クロージャが無名関数でなければならないのはなぜですか?

ラムダまたは無名関数は、名前のない単なる関数です。

例えば

クロージャーは、パラメーター リストで指定されていない変数にアクセスできる関数です。PHP 5.3+ では、これらの変数は use キーワードの後に​​指定され、クロージャ関数の関数定義が実行されるときに値または参照によってリンクされます。

例えば

JavaScript では、関数がネストされている場合、スコープ チェーンが存在するという意味で、すべての関数はクロージャーです。たとえば、最も内側の関数は、1. そのローカル変数、2. として知られる、それを囲むスコープ内の関数のローカル変数にアクセスできます。そのクロージャ スコープ、3. クロージャ スコープのクロージャ スコープとして知られる、エンクロージング スコープのエンクロージング スコープのローカル変数、...、など、N にもアクセスできるようになるまで続きます。最上位のスコープ。最も内側のスコープで var を使用して宣言された変数は、外側のスコープの変数をマスクします。それ以外の場合、最も内側の変数が外側のスコープのものと同じ名前を持ち、var で宣言されていない場合、外側のスコープの変数が使用されます。

これは、次の PHP コードと同等です。

これについてはすべてここで説明します

ここで私の質問です。なぜPHPのクロージャーはラムダ関数でなければならないのですか? JavaScript では、すべての関数がクロージャーですが、ラムダ関数である必要はありません。では、なぜ PHP で次のことができないのでしょうか?

(致命的なエラー: 構文エラー、予期しない T_USE、';' または '{' が必要です)