PHPにはどのような機能が必要ですか?[閉まっている]


88

今はホリデーシーズンであり、誰もが希望を抱いているので、PHPでどの言語機能を追加したいのでしょうか。私は、言語に対する実用的な提案/要望に興味があります。実用的には:

  1. 実際にできること(「PHPが私のコードの意味を推測してバグを修正してくれることを望んでいる」または「コードが5ミリ秒未満で実行されることを望んでいる」)
  2. PHPを別の言語に変更する必要のないもの(「中括弧の代わりに$記号を削除してスペースを使用したい」または「PHPをコンパイルし、静的に入力し、名前に#を含めたい」)
  3. 既存のすべてのコードを壊す必要のないもの(「500個の関数の名前を変更し、それらのパラメーターの順序を変更しましょう」)
  4. 何かない言語やそれのいくつかの興味深い側面を変更(ない:「私はXYZのプロトコルをサポートするための拡張があったことを望む」または「私はバグ#12345を希望するが最終的に固定されました」)
  5. 暴言以上のもの(「PHPがそんなにひどく吸わないように」)

誰にも良い願いがありますか?

Mod編集:Stanislav MalyshevはコアPHP開発者です。


9
@Stan:そのようなコメントを避けたいのと同じように、とにかくそれを手に入れるでしょう。問題 の人が 持っている PHPとは、主に、あなたのポストに排除しているものの範疇にあります。[...]
フィッシュトースター

24
[...]「あなたが実際に顔に当たらないで、顔に当たった経験をどのように改善できますか?」つまり、私たちが顔に当たっている間に無料でコーヒーを飲むのはいいことかもしれません。ですから、ここでいくつかの有用な答えが得られることを願っていますが(すでにあるように見えますが)、非生産的な答えに驚かないでください。
フィッシュトースター

5
@Fishtoaster:PHPがあなたに代わって顔にぶつかることに関連している場合、必ずそれを避けてください。あなたは間違いなくそれを改善することに興味がありません。ある人がいるにもかかわらず、そうなります。このトピックは彼らのためのものであり、あなたのためではありません。このサイトにはあなたのためのトピックもたくさんあると思いますが、これはそれらの1つではありません。
StasM

5
私は例として顔にぶつかることを使用しています-表面的な改善がそれほど重要ではない状況。ほとんどの人の問題が根本的なものにあるとき。それらの表面的な改善のための提案を得ようとするあなたの試みをノックしているわけではありません。
フィッシュトースター

6
@Fishtoaster:誰もが、驚くべきことに、PHPが嫌いというわけではありません。非常に柔軟で迅速(コーディング)。
10

回答:


119

名前付きパラメーターを気にしません。

getData(0, 10, filter => NULL, cache => true, removeDups => true);
// instead of:
getData(0, 10, NULL, true, true);

// or how about:
img(src => 'blah.jpg', alt => 'an albino platypus', title => 'Yowza!');

残念ながら、PHP開発者はすでにその考えを打ち破っています。


1
これは2005年のリストです。多くのアイデアが閉鎖され、その後生まれ変わりました。実際、適切な実装が行われた場合、それが受け入れられる可能性は十分にあります。
StasM

21
私のお気に入りのpython機能です。コードを非常に自己文書化します。
Keyo

7
@ジョシュK:それは大丈夫ですが、「配列」の呼び出しはあなたがそうするなら無駄です。それはあなたが本当にやろうとしていることを難読化するだけです。別のオプションは、配列の簡略構文です:make_img(['src' => 'blah.jpg'、...]);
エリック

2
@Erik:それも悪いオプションではありません。マイナー配列ラッパーで既にできるのに、この混乱を言語に追加する理由を言っています。
ジョシュK

4
@Erik:配列(JavaScriptの[]演算子など)のよりリラックスした構文は、喜ばれる機能です。
ジョシュK

93

より間接参照:

echo something_that_returns_array()[4];

他の人は、名前付きパラメーターと短い配列構文について言及しています。短いオブジェクト構文も気にしません。

$a1 = array(1, 2, 3, 4);
$a2 = [1, 2, 3, 4];

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?

18
()[]構文はすでにトランクにあります。残念ながら、配列のショートカットは拒否されましたが、復活を期待しています。
StasM

2
この機能が大好きです。配列ではなく、something_that_returns_object()-> 4を使用できるのはなぜですか?
バラクラーク

4
配列表記やオブジェクト表記のようなJavascriptは揺れ動くでしょう。フロントエンド開発者として、それがPHPコードで私を最も悩ませています。
ブリープループ

1
それがない@DisgruntledGoat、以下を参照してくださいfunction something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
アニカBackstrom

2
@DisgruntledGoat:()->構文の問題は、オブジェクトが返されたときにのみ機能することです。さらに悪いことに、オブジェクトには指定された名前のプロパティ/メソッドが必要です。 、あなたがそれを与えたパラメータを受け入れ、それがそれ以上を必要としないように祈る...などなど
phant0m

72

約13年間PHPを使用し、約4年間JSを大幅に使用した後、JSから借用するのにPHPがうまくいくと思うことがいくつかあります。

1)配列とオブジェクトの略記法。これは内部で議論され、撃ち落とされた可能性があると思います(したがって、私は聞いた-ソーセージがどのように作られているのか見たくない)が、JSの配列とオブジェクトの文字表記は本当に大きい生産性の向上。

例えば:

$arr     = [1,2,3,4];
$assoc   = [foo=>'bar', baz=>'boo'];
$stdobj  = {foo->'bar', baz->'boo'};

(私見)書くよりもずっと簡単できれいです

$arr     = array(1,2,3,4); // not too bad
$assoc   = array("foo"=>'bar', baz=>'boo'); // not too bad either
$stdobj  = new stdClass; // this gets pretty rough
$stdobj->foo = 'bar';
$stdobj->baz = 'boo';

混乱の可能性についての懸念が生じたと聞いたことがありますが、実際には、これは、たとえばヒアドキュメント表記法よりも混乱を招いていますか?少なくとも、PHPでstdClassオブジェクトを作成することは、練習を思いとどまらせるほど冗長です。

2)以前に定義された関数とメソッドを再定義できると本当に便利です。クラスを拡張し、新しいクラスをインスタンス化するのが非常に複雑または非現実的な状況を特に簡素化します。ただし、コア/非ユーザースペース関数およびメソッドの再定義は避けるべきだと思います。


これら2つに加えて、PHP unicodeを透過的にサポートする必要があると思います。これは開発者にとってますます問題になりつつあり、現在PHPで提供されているソリューションは混乱を招き、頻繁にパフォーマンスが低下します。すべての標準の文字列機能をすぐにユニコードで使用できるようにすることは、PHPプログラマーにとって大きな勝利です。

質問してくれてありがとう!


(2)runkitを見てください。(3)特に外部世界のほとんどがユニコードではないため、ユニコードは困難です。パフォーマンスを低下させるか、多くの追加作業をJavaが行うように人々に要求する必要があります。それが、php6 unicodeの努力がうまくいかなかった理由です。
StasM

8
ユニコードに関しては:難しいかもしれませんが、非常に便利です(PHP自体の開発は確かに難しいですが、大きな利点がありますか?)。 XHPによく似ていますか?再度、感謝します。
Funkatron

5
$ object =(object)array( "foo" => 'bar'、baz => 'boo');
マーキューシオ

3
「外の世界の大部分はユニコードではありません」とどのように見えるのかわかりませんか?人の話をしていますか?または、他の何か?世界の大多数の人々が(大きな差で)Unicodeで最もよく表現される言語を話すからです。
ディーンハーディング

1
間違いなくユニコードのサポート。グローバルに使用されるあらゆる種類のアプリを出荷することは、それなしでは手始めではありません。PHP開発者が、適切なUnicodeサポートのエンジニアリングが簡単であると考えているかどうかは重要です。人々はそれを必要とし、彼らはそれができないプラットフォームの失敗を回避する方法をハックしています。Delphiは、別の文字列型を追加し、暗黙のキャストを使用してデフォルトにし、以前の動作に戻すためのグローバルスイッチを追加しました。PHPで同じようにできないのはなぜですか?
ジョーリセブレヒト

48

元長年のPHP謝罪者として、私が望むこと:

  1. 配列の短い構文。PHP配列は、その柔軟性のために言語の最も素晴らしい機能の1つですが、を書くのは手間がかかりますsome_array_method($argity, array('key' => $value));。残念ながら、この提案は既にPHPメーリングリストで取り上げられていたと思います。
  2. finally サポート
  3. 属性/注釈。これらを使用すると、コードの再利用を可能にする方法でメソッドにカスタム動作を追加できます。たとえば、MVCフレームワークでAuthorizeAttributeは、コントローラーまたはアクションメソッドでユーザーの承認が必要であることを示すを定義できます。フレームワーク自体が属性を検索し、それに応じて属性に作用します。PHPUnitは、リフレクションを使用して読み取ることができるdocblockコメントにそれらを配置することで、すでに一種の属性を使用していると思いますが、実際の機能をdocblockコメントに配置することは確かにハックです。
  4. 短いラムダ構文。書くのfunction($x){ return $x*2;}ではなく、多分$x => return $x*2何かを書くことができます。これもまた、この機能を使用するためのドラッグになります。例えば、$results = array_filter(array(1,2,3), function($a) { return $a % 2; }):$results = array_filter(array(1,2,3), $a => return $a % 2 );旧ちょうどあなたが達成しようとしている実際の作業は基本的に無関係だそんなに多くの配管を持っています。
  5. Decimal演算子のオーバーロードがないため、通常の演算子を使用した数学演算をサポートする組み込み(固定小数点数学)が適しています。
  6. モアーマジック法。魔法の方法は素晴らしいです。PHPが魔法のメソッドを介して演算子のオーバーロードを追加するのを見ることができました(これは基本的に決して起こらないことを知っています)。

48

PHPを真にオブジェクト指向にします。slap on another global functionPHP の進化を終わらせる必要があります。

array_merge(array_filter(array_intersect_key($arr1, $arr2), "is_int"), $arr3);

これは読みにくいです。自分でメンタルスタックを作成し、自分でコンパイルする必要があります。基本的に逆に読む必要があります。$dog->wakeup()->bark();に比べて読みやすいですbark(wakeup($dog))

$arr1->array_intersect_key($arr2)->array_filter("is_int")->array_merge($arr3);

オブジェクト/メソッドのサポートを有効にするためのステップを作成しました。実際のコアPHP関数で使用してください。

500個の関数の名前を変更し、それらのパラメーターの順序を変更しましょう。

この機能をメソッドにシフトすると、一貫していくつかを使用してメソッドの名前を変更できます。文字列と配列に独自のメソッドがある場合、後方互換性が壊れますか?


3
配列がオブジェクト型ではないことは、PHPの大きな間違いだと思います。あらゆる種類のトラブルにつながります。残念ながら、それは進化的なものです。ただし、ここでは拡張機能またはユーザー空間を使用して必要なことを実行できます。おそらくSPLにうまく適合します。
StasM

3
同じ引数が文字列に適用されます。私は、一般的な方法の欠如に言及しているだけです。Java、Python、C#などの言語にはすべて、はるかに読みやすいコードがあります。機能を探しているのではないかと思いますが、IMOが破損している部分を修正する方が良い結果が得られるでしょう。
Keyo

6
いいえ、ばかげたことはありません。それはdog_wake_up($dog); bark_dog($dog);
Matchu

2
私見、すべての新しい文字列メソッドは、UTF-8を予期および送信し、入力が有効なUTF-8でない場合は例外をスローする必要があります。これにより、ユニコードのサポートを大幅に変更する必要が大幅に削減されます。
rjmunro

1
@luiscubalいいえ。追加のパラメーターは、関数に追加する新しいものを発明する場合、後でパラメーターを追加できないことを意味します。たとえば、$ string => trim()が空白のみを行った場合(4.1.0以前など)、システムはISO-8859-1文字列から空白を削除した$ string => trim( 'ISO-8859-1')と言います。 。その後、空白ではないものをトリミングできるようにしたい場合、最初にエンコードを指定しない限り、そのためのパラメーターを追加することはできません。UTF-8ではないテキストはどこでも間違っていると信じるように人々を励ますべきです。
rjmunro

40

言語統合クエリエンジンは素晴らしいでしょう。LINQと呼ばれる.NETで利用可能なもののような並べ替え。大量のデータの配列を整理し、データベースアクセスを標準化することで、SQLインジェクション攻撃の成功を減らすことができます。


2
パラメータ化されたクエリを簡単にするものは何でも投票できます!
ディーンハーディング

1
私はそれがあなたのデータベースのモックとのユニットテストが簡単にオブジェクトを作ると思うので、標準化されたデータベースへのアクセスは、実際にLINQのようなものの非常に重要な利点だと思います(あなたがPHPコードの代わりに、SQLクエリをからかっているからです。)
davidtbernal

このようなものがコアになるとは思わない。それは、pecl拡張によく適合するでしょう
ハラルド

38

ああ。プリミティブのタイプヒンティング。それはいいね。


1
私はPHPのKISS原則が(ある程度まで)気に入っていますが、それを強く支持しています。その理由は、本当に防御的になりたい場合は、セッターメソッドで同じ型チェックコードになることになります。言語がネイティブにサポートしていれば、簡単に削除できます。
MicE

4
「タイプヒンティング」は非常に残念な名前でした。「ヒンティング」ではなく、厳密なタイピングです。PHPのような動的言語では、原始的な厳密な型指定は不適切だと思います。強制型付け(内部関数と同じこと-strlen(123)を試してみてください)は問題ないかもしれません。
StasM

6
+1。関数宣言の型ヒント(または厳密な型指定)は非常に役立ち、各メソッドであらゆるif(!is_int())がらくたを削減します。
フィルスタージョン

5
@StasM同意しない。ユーザーが静的に型付けされた方法で言語を使用することを選択できるようにすることは、動的言語の範囲内で完全に行われます。そして、それははるかに優れたエラーキャッチを可能にします。したくない場合は使用する必要はありませんが、個人的にはintが必要な場所に文字列が渡され、愚かな文字列が渡されている場所を見つけるためにコードを検索する必要がありますまたは、すべてを常にチェックするように入力します。
ダニエルビンガム

2
@StasM完全に静的に型付けされた変数を導入しなければならない理由はまったくありません。はい、コード内でエラーをシフトします。それがポイントです。エラーは、関数内ではなく関数呼び出し時に発生します。これにより、エラーが実際に発生している場所がわかりません。型変換エラーについては、エラーが発生します-実行時にyes-関数呼び出しで。すぐに正しい型に変換して問題を修正してください。intを期待し、どこからわからない関数に文字列を表示するよりもはるかに優れています。
ダニエルビンガム

34

すぐに使えるより良いユニコードのサポートを本当に望んでいます。ほとんどの言語はその方向に動きますが、PHPにはまだ奇妙なコマンドが散らばっています。

PHP文字列は単なるバイト配列です。それらのコンテンツは、現在のデフォルトのエンコーディングに依存しているため、移植性がありません。

同じことは、serializeによって構築された表現にも当てはまります。実際にはエンコード情報を保存せずに、文字列の長さプレフィックス付きバイト表現が含まれています。

ほとんどのPHP(文字列)関数には、Unicodeに関する手がかりがありません。各機能のリスクレベルを含む詳細なリストについては、http//www.phpwact.org/php/i18n/utf-8を参照してください。

http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/


ユニコードのサポートは、思ったよりもはるかに困難であることが判明しました。それが、php6の努力が行き詰まった理由です。今のところ、utf-8があります。最善の方法は、おそらくintl拡張機能の一部として、文字列関数のutf-8サポートを追加することだと思います。
StasM

3
ところで、引用は間違っています。PHPの文字列はバイト配列ですが、その内容は作成時と同じくらい移植性が高く、「デフォルトエンコーディング」に依存しません。これは単なるバイト配列であり、utf8に入れ、utf8に入れ、utf16に入れます-utf16に入れます。phpwact.orgリンクは死んでいるようです。
StasM

1
intl拡張機能がデフォルトで有効になり、UTF-8を必要とする人々(誰もがそうではないでしょうか)が、文字列関数を期待どおりに動作させるためにホストと戦う必要がなくなりました。
エミルステンストローム

また、文字列の説明に感謝します。私はしばらくPHPから離れていたので、少し錆びています。私の代わりにスウェーデンの「O」あなたの名前は混乱が:)であるに持つのPython 3でそれらをPHPがするように同様の問題を抱えているのPython、とUnicodeの戦争を戦ったが、解決してきました
エミールStenström

これは私がで改善が見たいのですが、間違いなく一つの領域である。
ネイサン・オスマン

32

一貫性のない名前が付けられ、パラメータが設定された非オブジェクトメソッドを置き換えるメソッドを組み込み、文字列オブジェクトを作成します。例えば

$subject->replace($search,$replace);
$string->split($separator);
$string->trim();

編集:もう1つ:これらのメソッドは、エンコーディングを処理することを特に意図したものを除いて、常にUTF-8を期待して送信する必要があります。入力が無効なUTF-8の場合、関数の出力がエンコードの影響を受けない場合でも、例外がスローされます。


アップ、それはまさに私が目指しているものです。
ケモ

1
subject->verb(object)、パラメータの順序を覚えやすくします。
明唐

+1この種のことを行うために独自の文字列クラスを作成してみました。これにより、コーディングが非常に簡単になり、パラメーターの順序を忘れることはありません。
不機嫌なヤギ

2
では、何がis_object($string)返されるのでしょうか?これにより、後方互換性が大幅に損なわれるか、またはまったく直感的ではないが、ほとんどではないオブジェクトが導入されます。
Tgr

@Tgr:is_object()は非推奨です-「not a object」などはありません。短期的には、任意のオブジェクトでオフにできるプロパティである必要があり、デフォルトの文字列コンストラクターはそれをオフにします。
-rjmunro

24

1)新しくインスタンス化されたオブジェクトが "$ this"を返すようにしたいので、メソッドチェーン$ user = new User( 'john')-> setLastName( 'Doe')-> save();

2)これまでにルビーを使用したことがあり、最近ノードを使用したことがある場合は、優れたインタラクティブシェル(IRB)があります。PHPが実際に役立つものを持ちたいと思っています。

3)Traits / Mixins、しかし、それらは進行中であると聞きます。

4)2番目の短い配列$ myArray = ['my'、 'array'];

5)一貫した命名/順序(つまり、針の干し草の山)


create()#1を回避するためだけに特別なことは何もしないメソッドを作成する必要はありません
アランピアース

同じことを行いますが、遅延静的バインディングとオブジェクトスーパークラスを使用して、スーパークラスを拡張するすべてのクラスにメソッドがあります。例:SomceClass extends SuperObject {}; SomeClass :: create()-> somemethod();
dukeofgaming

github.com/philsturgeon/php-psをご覧ください。これはほんの始まりに過ぎませんが、多少の助けがあれば非常に便利です。
フィルスタージョン

1
利用可能に- PHPで迅速な実験をコーディングするための対話型シェルを提供していますPEARパッケージもありますpear.php.net/package/PHP_Shell
kguest

(新しいFoo())-> bar()は5.4の一部です。3)と4)も同じです。
StasM

20

1)include()を削除してください。他のファイルへの参照は参照である必要があり、実際にあるソースコードファイルの内容を別のファイルに配置することはできません。あまりにも多くのPHPプログラマーが、ライブラリーを参照する手段ではなく、関数呼び出しのタイプとしてinclude()を使用しています。これは、可変状態と不安定なコードのあらゆる種類のあいまいさをもたらします。これをPerlに似た「use」コマンドに置き換えます。

2)PHPアプリケーションを単一の配布可能なバイトコードファイルまたは実行可能ファイルにコンパイルする、すぐに使用可能な方法を提供しください。これにより、商用開発言語としてのPHPの魅力が大幅に高まります。これは、言語の基本コンポーネントである必要があります。アプリケーションのGUIに使用されるhtmlファイルを心配しないでください。

3)PHPタグをHTMLに埋め込む機能を削除してください。または、少なくとも「埋め込みなし」モードを提供します。これは絶対的な混乱であり、アプリケーションロジックとプレゼンテーションを混在させることにより、不適切なデザインを助長します。開発者は、表示にテンプレートを使用し、PHPファイルを一緒に平手打ちして最高の結果を期待しないでください。

署名済み、

グランドマスターB

ps:ここの他の人の言うことを聞かないでください、私は一年中素敵です


37
1)。インクルードは素晴らしいです。すべてが含まれています。2)。これはいい。3)テンプレートはPHPの最も強力な機能です。他のテンプレートのでたらめを強制的に使用することは、非常に悪い動きです。
ジョシュK

8
私は(1)と(2)が好きですが、(3)は逆行性のステップのようです。PHPはテンプレート機能を提供します。賢く使うかどうかはあなた次第です。
geekbrit

11
3は意味がありません-MVCフレームワークのVにはタグの埋め込みが必要です。
アレックス

9
私はこの答えを「親愛なるサンタさん、PHPをPHPにしないでください」と読みました。
スティーブン

1
PHP テンプレート言語なので、3はまさにその通りです。
アンドリュー

18

E_ERROR含む文字列であると仮定するのではなく、未定義の定数に対するiniディレクティブE_NOTICE


1
クラス定数はそれを行います、ところで。
StasM

4
真剣に、PHPが引用符で囲まれていない文字列を仮定する理由を理解していません。それは史上最も愚かなことです。E_ERRORまたはを選択しますE_PARSE
BoltClock

14

新規参入者にとって意味のあるよく考えられた命名規則を使用して、グローバル名前空間を正規化します!

私たちの最愛のジェフ・アトウッドの言葉を引用すると、PHPはダメですが、それは問題ではありません


1
私は原則として同意しますが、実際にそれを行う方法はわかりません:)
StasM

3
@StasM:最初のステップは、ライブラリの新しいバージョンを名前空間にし、プログラマが(ini設定を介して)現在のグローバルライブラリを無効にすることだと思います。私は互換性パックが古いバージョンのためにあると思うだろうが、書くのはそれほど難しくないはずだ。
ミチャウT


13

1)より短い配列/オブジェクト構文、la JavaScript(前述)

2)const変数のように、計算の結果を許可しますdefine()

3)コンストラクターから直接チェーンする: new User()->name('Ryan');

4)配列の逆参照: something_that_returns_array()[4];

5)拡張されたSPLサポート。SPLは、(とりわけ)文字列および配列関数をオブジェクトとして再構築するという、まともな仕事をしています。SPLを拡張することで、言語が非常に曖昧であるという多くの不満を解決できる可能性があります。

6)使用ArrayObject()はを使用するのと同じくらい透明でなければなりませんarray()。あなたはすることなくすることのようなarray_filter($array_object_instance)ことができるはずarray_filter($array_object_instance->getArrayCopy())です。もちろん、さらに良いでしょう$array_object_instance->filter()

7)フルオンUnicodeはいいでしょう。

8)奇妙な自動型変換の実行を停止します。たとえば、echo最初に明示的に文字列として型キャストしないと、SimpleXMLElementオブジェクトを使用できません。または、少なくとも、発生したときに何かをスローします(たとえば、厳格モードまたはその他のモードerror_reporting(-1))。

9)複数のスレッド、または何らかのイベント/非同期コールバックのサポート。これは、cURLを介して大きなファイルをアップロードしようとするときに最も重要です。昔ながらのスレッドの代わりに、AppleのGrand Central Dispatchのようなものがいいでしょう。または、非同期リクエストを作成してコールバックを定義できるJavaScriptのようなものです。

10)一貫した命名/順序(つまり、干し草の山)はいいでしょうが、これはSPLでより良く解決できると思います。

11)IRBなどの公式にサポートされているインタラクティブPHPシェル。FacebookにはphpshPythonで書かれたものがありますが、私が見たいと思う洗練はありません。

12)Reflection APIの場合、(a)定数(グローバルおよびクラス)のdocblockコメント、および(b)PHPDocのようなコメントを適切なデータ構造に解析するためのサポートを追加します。これを行おうとする「docblock」と呼ばれるPECLパッケージがありますが、作者があまり得たものではないようです。

EDIT:13)私はまた、使用する能力見てみたい!?関数名に- Rubyの缶などを。


arrayobjectはarray_ *関数でサポートする必要があることに同意します。しかし、arrayobjectのサブクラスを考慮する場合、「array_merge」のようなものに対して期待される結果はどうなりますか。同じクラスのインスタンスのみをマージでき、array_mergeは何を返しますか?PHP配列またはarrayobjectのインスタンス(それぞれサブクラス)?
ハラルド

データは内部的に配列であり、ArrayObjectはそれを機能でラップしているため、ArrayObjectのサブクラスでさえ内部で配列を処理していると主張します。別の標準配列またはArrayObject(またはサブクラス)をマージできると期待しています。それが返すものに関しては、新しいArrayObjectも返す必要があると主張しますが、simplexml_load_string()は、結果がインスタンスになるクラスの名前を指定できる場所を設定するという先例に従います。
ライアンパーマン

12

1)Pythonリスト内包のスタイルの配列内包:

$newlist = array($x->something for $x in $oldlist);

//with short array syntax:
$newlist = [$x->something for $x in $oldlist];

2)短い配列構文

$newlist = [1,2,3,4,...];

3)empty()が文字列 '0'を真とみなさないようにする


2
(1)イテレータとクロージャから調理されたものの方が良いと思います。
StasM

+1 IMHO、これはすべての言語とイテレータに含まれるべきです。持っていない便利な方法です。
エヴァンプライス

empty()はの論理的な反対でif ($x)あるためempty('0')if ('0')false であるため、trueであることが理にかなっています。唯一の違いは、empty()変数が設定されていない場合に通知をスローしないことです。
アンドリュー

12

CONSTANT配列を作成/定義する正当な方法を見たいです。この種の機能をシミュレートするためのハック的な方法がいくつかありますが、それがPHPの単純な機能であると便利です。Javaの「最終」宣言に似た方法で配列を作成できれば便利です。

セットアップが非常に簡単なログインシステムを作成しました。必要なのは、テキストファイルの配列の内容を変更して、ユーザー情報に必要なフィールドを指定することだけです。forループのスワスを使用して、フォームの生成や入力の高感度化からデータベース呼び出しまですべてを処理しますが、すべてこの元の配列に依存しています。

配列を含むファイルはアクセス許可でロックダウンされますが、配列がエーテル内を移動すると、変更可能になります。システムは非常に安全だと感じていますが、偶然に任せるのは好きではありません。配列をファイナライズする方法は、このような状況に適しています。

新しい考え!!

ああ、私は本当にPHPで本当に好きな何かを考えました。.htaccessの動作に似たphpファイル操作とディレクトリ操作を制御する何らかのシステムが欲しい。

.phpaccessファイルは、ある種の同じドメイン/同じ生成元ポリシーをトリガーする必要があります。

たとえば、仮想ホストで多くのサイトをホストしている場合、保護されたディレクトリで動作しようとしている実行中のスクリプトの開始点を確認するようにphpに指示する.phpaccessファイルをディレクトリに置くことができます。スクリプトがそのディレクトリまたはそのサブディレクトリから来ていない場合、ファイル操作またはソケット操作は拒否されます。

このようなシステムは、仮想ホスティングをより安全な環境にすると思います。これらのいずれかを各仮想ホストの上部に配置できれば、誰かが近隣の仮想ホストから侵入する方法を見つける可能性が低くなります。

また、この方法の逆の方法でセキュリティを確保する方法があるとよいでしょう。つまり、単一のディレクトリ内のスクリプトの到達範囲をそのディレクトリに制限します。

その陰と陽は知っています!


+1 final。明確にするために:final変数の値は実行時に設定できます(定数は定数式である必要があります)が、一度しか設定できないことを意味します。C# 'sも参照してくださいreadonly
davidtbernal

1
読み取り専用などに取って代わるトランク用のゲッター/セッターの提案があります。おそらく変更は難しいかもしれませんが、不変の配列です。
StasM

phpaccessについては、PHPには既に説明した「セーフモード」があります。
不機嫌なヤギ

11

筋金入りのPHPプログラマーとしての私の2つの最大の願い:

  1. 最後にサポートします。フラグや同様の手段でこれをフィクションで回避するのは大きな混乱です。
  2. ゲッターとセッターのC#の構文のサポートを期待しています。ゲッターとセッターがたくさんある場合、C#のような単純な構文は、Javaの方法でゲッターメソッドとセッターメソッドを記述するのではなく、パフォーマンスを大幅に向上させます。マジックメソッドは、メンバーを動的に作成したい場合(たとえば、テンプレートレンダラーに使用する変数を指定したい場合)に最適ですが、IDEをオートコンプリートする通常のプロパティには適していません。タイプなど。これにより、コードを小さくし、読み取りやすく使いやすいものにすることができます。

1
1.残念ながら、やることは難しいですが、間違いなく良いtodoアイテムです。2. wiki.php.net/rfc/propertygetsetsyntax
StasM

@StasM:アノテーションを介してそれを行う方法は?/ ** @get getFoo;に沿った何か。@set setFoo; * / private $ foo;
ミチャウT

9

言語構文pihipiphprebootには、開発者が興味を持っているものの手がかりがいくつかあります(phprebootはJSになりすぎています)。

開発方法論:このような調査が実際に考慮されると、PHP.netの寿命が大幅に向上します。気ままな午後のIRCセッション構文の決定をこれ以上行わないでください。

個々の機能:いくつかは以前に言及されましたが、ここでいくつかのカルマを喜んで燃やして、ここで余分な鈍器にします:

  • Unicode文字列タイプ。
  • Bigint(Pythonを参照)。
  • ビルトイン関数とクラスを削除/名前変更/オーバーライドするRunkitビルトイン。これらは常に適切に設計されているとは限りません。
  • モダンOOP
    • 多重継承
    • スカラーはオブジェクトとしても機能します(Pythonを参照)。たとえば、array()はArrayObjectとして機能し、文字列はSplStringとして機能します(使用可能なメソッドが必要です。すべての文字列関数はとして利用可能ですstr::toupper()
  • shitty shit \namespace名前空間構文を廃止し、パーサーを修正して::、代替として採用します。本当の言語のようにね。
  • LINQのあらゆるバリエーション(ただし、皆さんが賢明な構文を考案しているとは信じていませんが)
  • またはXMLリテラル。
  • php.iniのランタイム動作とセマンティックスイッチを削除します。それは興奮の一部を取り除きますが、開発者とユーザーベースに利益をもたらすでしょう。
  • はい、magic_quotesはまだ削除されていません。
  • Zend EngineバイトコードをPBCに変換する

とはいえ、これが明らかでない場合は、他の誰かに後者を行うための資金を喜んで提供し、主要な実装としてphp.netを終了します。:P
ああ、ちょうど気づいた、それはコミュニティwikiです。ですから、あなたがカルマのために実際にここにいるのではなく、純粋な興味のためにチャンスがあるのです。その場合は、言語に深刻な影響を与える<b>問題</ b>を調べてください(口内炎)。


5
\名前空間構文は嫌いですが、なぜそうなったのかは長く悲しい話であり、おそらく変わらないでしょう...おそらく、私の主要な候補となるPHPの1つだけを変更できるとしたら。しかし、それはそれです。
StasM

@StasM:フィードバックに感謝し、いくつかのPHPのことについて失礼でしたが、私はPHPに関心があります。したがって、非常に熱心です。-推論について少し読みました。バックスラッシュのジレンマはまだ大きな問題ではありませんが、来年は図書館が広まるときになります。だから、誰かが\ cargo \ cult \ class \ namesをアンダースコアスキームに書き直すパーサーを書くことを願っています。
マリオ

たぶん私は頭がいいのですが、名前空間に「::」を使用するか「\」を使用するかで違いは何ですか?
ミチャウT

@Pies:これ::は、C / C ++構文に近い言語ではより自然でした。そして、 `\`はすべてのプログラミング言語の中で異常であるだけでなく、テストされていない意味を持っています。以前の議論:stackoverflow.com/questions/238550/…またはdevelopers.slashdot.org/article.pl?sid=08/10/26/1610259およびreddit.com/r/programming/comments/79cut/…-しかし特にフィードバックなしでそれを決定し、開発者コミュニティにそれを吸い上げるようにシグナルを送ることは、あまり歓迎されない動きでした。
マリオ

1
+多重継承の場合は1000000。
ts01

8

エラーと例外を単一の概念(例外)に統合したいと考えています。そのようにしてバグを見つけて修正するために、例外をキャッチしてログに書き込むことができるのは素晴らしいことです。しかし、非常にめったにヒットしないコードパスに根本的に間違った何か(PHPエラー)がある場合、その情報を同じ問題データベースに集中させる良い方法はありません。

サンタさん、php.iniにすべてのエラーを例外に変えるスイッチを導入してください。理想的には、コードでキャッチできる例外です。


1
エンジンには既にそのサポートがあり、多くの拡張機能がそれを使用しています。set_error_handler()およびErrorExceptionを使用して簡単に行うこともできます。...しかしE_STRICT / E_NOTICE / E_DEPRECATEDの用心
StasM

私はこれらの方法をよく知っていて、本当にハッキーです。E_STRICT / E_NOTICEなどを含む統一された方法が欲しいです。
アレックス

7

PHPは、小規模から中規模のWebサイトをノックアップするのに適しています。私は少し想像力に欠けるに違いありません。この質問への回答として考えることができるのは、トラフィックの多いサイトに合わせてスケーリングを改善するものだけでしょう。

たとえば、あるプロセスでデータベースを更新し、別のプロセスで出力ページを作成するなど、他のコアへのプロセスの生成について考えています。簡単なグーグル検索は、これがシミュレートできることを示していますが、現時点ではPHPで直接サポートされていません。


1
実際、それについてもっと考えてみると、データベースのオフロードは興味深いシナリオのようです。そのため、+ 1 :)
StasM

1
@Stasm、個別のリクエストが個別のプロセスとして実行されることを意味すると思います。ページの生成とバックグラウンドの計算を必要とする複雑なページについて話しています。私は間違っているかもしれませんが、別のプロセスでデータベース更新操作を(たとえば)発生させる方法はないと思います。これを行う理由は、ページの生成に直接関係しないすべての処理がシリアルに完了するのを待たずに、ページをより早くリクエスターに送信するためです。PS ..更新してくれてありがとう!
geekbrit

7

スカラー型はオブジェクトとして扱われず、実際のオブジェクトは他の型やオブジェクトのように振る舞うことができません(__toString()による文字列を除く)。


ええ、タイプキャストのための魔法の方法をお願いします。
ミチャウT

7
  • 列挙のサポート(java 1.5+など)
  • インターフェイスとクラスでメソッドの戻り値の型を定義できる
  • プロパティとメソッドの注釈/メタデータ定義のサポート。
  • メソッドのスカラー引数に対して厳密な型ヒントを行うことができます。

+1私はPHPでこれらすべてのものを見たいと思っています。
ジェレミー

6

http://php.netで「ユーザーが投稿したメモ」をクリーンアップします。一般的に大きな価値である一方で、それらは時々本当の混乱です。


1
何らかの投票アップ/ダウン機能と、返信内の元のコメントにリンクする機能は確かに素晴らしいでしょう。
-Tgr

5

PHPにはかなり適切な配列関数がいくつかあり、リスト処理能力、コールバックcreate_function()、基本的なラムダ計算を提供します。

それに関する主な問題は、PHPで非常に冗長であるということです。特にmap / reduceコマンドが関係する場合、速記システムは優れているでしょう。

さらに重要なことは、リスト関数が完全に完全ではないことです。

  • foldr機能はありません、array_reduce()提供しますfoldl
  • array_map()第二引数にキーを渡す必要がありarray_walk()ません
  • array_map_keys()キー変更のために有用である可能性
  • リスト内包は、非常に不格好でrange()array_fill()そしてarray_fill_keys()唯一の非常に多くのケースを処理し、array_filter()別のものです

私はPHPをHaskellにするつもりはありませんが、PHPはリスト型のデータ構造の操作によく使用され、この点に関するツール一式があれば便利です。


1
私の同僚はまた、関連する機能を再配置するために、他の追加機能が存在する可能性があると考えています。彼のgithubアカウントで言及されている:これらはarray_all()とarray_any()の欠如であり、これらは*コールバックによって表される条件が配列内のすべての要素または任意の要素に対して保持されるかどうかをチェックします。 gist.github.com/44350
kguest

5

演算子のオーバーロード:

$result = $MatrixA + $MatrixB * $MatrixC;

1
PHPが動的に型付けされた言語である場合、これがどれほど適切にクリックされるかはわかりません。
BoltClock

5
多分それは__add($ OBJ)、__times($ OBJ)などのように、マジックメソッドを経由して行われるべきである
のMichałT

PECL ext:pecl.php.net/package/operatorとして既に存在します。それをメインソースとマージするのにあまり
労力を費やす

4

E_WARNINGを生成する代わりに例外を追加します...次のようなものを使用できないのは非常に迷惑です。

try{
   $f = fopen('asd', 'r');
   flock($f, LOCK_SH);

   while(!feof($f)){
       echo fread($f, 512);
   }

   fclose($f);

}catch(IOException $ex){
   echo 'Oops, something wrong: '.$ex->getCode();
}

もちろん、現在はあまり実用的ではありませんが、受け取るのは非常に面倒です:

警告

警告

警告

そして、正しい例外をスローするために、独自のerror_handlerと、生成されたエラー(許可、不正なファイル名など、ここでの他のエラーのソースについては気にしません)をスニッフィングする文字列を書くことなく、コードのフローを制御することはできません。

なぜそれが重要なのかを説明しないでほしい。

PHPはかなり前にオブジェクト指向になりました。PHPを使用するプログラマーは、「goto」を導入せずにOO機能を楽しみにしています。実際に起こったことを知り、エイプリルフールだと思いました。


キャッチされない限り、例外はスクリプトを強制終了します。実稼働サーバーでの警告はログに記録され、ユーザーには表示されません。この機能を変更すると、キャッチするように設計されていないため、多くのスクリプトが破損します。(注意、自分で例外をスローするためのエラーハンドラを作成していることに注意してください)。さて、PDOが警告や例外を投げることができるようになりました。プログラマは実行時に決定します。その機能は、おそらくより多くのモジュールに追加する必要がある機能です。
Reece45

4
  1. オブジェクトモデルの統合-すべてのオブジェクトを基本オブジェクトクラスに拡張します。Objectクラスは(とりわけ)すべての魔法のメソッドを実装します(したがって、それらはもはや魔法ではありません!)

  2. 拡張機能を独自の名前空間に移動する-グローバルな名前空間を整理する $conn = new \MySQLi\Connection();

  3. spl_autoload()関数のクリップを解除してください!真剣に、これはPHPの最大の機能の1つであり、同時に最も役に立たない可能性もあります。spl_autoloadはデフォルトのオートローダーで、名前空間と複数のファイル拡張子をサポートしていますが、何らかの理由でファイル名を小文字にする必要があります。これに関するバグレポートがありますが、スタッフは後方互換性のために修正しないと答えました。正しい...デフォルトのフレームワークが機能しないため、すべてのフレームワークに独自のオートローダーが付属しているわけではありません!



4

汚染サポートを最新バージョンに上げ、標準ビルドに含めます。できればデフォルトの構成で有効にしてくださいhttp://wiki.php.net/rfc/taint

これにより、人々を適切にコード化することにより、XSSおよびSQLインジェクション攻撃を防ぐことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.