今はホリデーシーズンであり、みんなが願っていますので、どの言語機能を望みますかPHPが追加されますか?言語の実用的な提案/願いに興味があります。実用的なI平均:
誰か良い願いがありますか?
Mod編集: Stanislav Malyshev はコアPHP開発者です。
名前付きパラメーターは気にしません。
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 devs そのアイデアを打ち倒しました はすでに。
より逆参照:
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?
PHPで約13年間、そしてJSで約4年間働き続けた後、私が思ういくつかのことがあるPHPはJSから借りる:
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つに加えて、私はPHPmust透過的にUnicodeをサポートするだと思います。これは開発者にとってますます問題になりつつあり、現在PHPで提供されているソリューションは混乱を招き、パフォーマンスが低下することがよくあります。標準の文字列機能すべてをそのままの状態でユニコード対応にすることは、 PHPプログラマーにとって大きな勝利です。
質問してくれてありがとう!
かつてのPHP謝罪者として私が望むこと:
some_array_method($argity, array('key' => $value));
を記述するのは簡単ではありません。残念ながら、この提案はすでにPHPメーリングリストから削除されたと思います。finally
サポートAuthorizeAttribute
を定義できます。これは、コントローラーまたはアクションメソッドがユーザーの承認を必要とすることを示します。フレームワーク自体は、属性を探し、それに応じて動作する責任があります。 PHPUnitは、リフレクションを使用して読み取ることができるdocblockコメントに属性を配置することですでに一種の属性を使用していると思いますが、実際の機能をdocblockコメントに配置することは確かにハックです。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 );
の場合、前者には非常に多くの配管があり、達成しようとしている実際の作業には基本的に関係ありません。Decimal
(固定小数点演算)は、演算子のオーバーロードがないため、一種のニースです。PHP本当にオブジェクト指向です。PHPの_slap on another global function
_の進化は終了する必要があります。
_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個の関数の名前を変更し、それらのパラメーターの順序を変更してみましょう。
この機能をメソッドにシフトすると、一貫した方法で名前を変更できるようになります。文字列と配列に独自のメソッドがある場合、下位互換性が失われますか?
言語統合クエリエンジンはすばらしいでしょう。 LINQと呼ばれる.NETで利用可能なもののようなものです。これにより、大量のデータの配列を整理し、データベースアクセスを標準化できるため、SQLインジェクション攻撃が成功する可能性が低くなります。
ああ。プリミティブのヒントを入力します。それはいいね。
私は箱から出してすぐにより良いユニコードのサポートを望んでいます。ほとんどの言語はその方向に移動しますが、PHPにはまだ奇妙なコマンドが散らばっています。
PHP文字列は単なるバイト配列です。現在のデフォルトのエンコーディングに依存しているため、コンテンツは移植できません。
同じことが、serializeによって作成された表現にも当てはまります。これには、実際にエンコード情報を保管せずに、文字列の長さが前に付いたバイト表現が含まれています。
ほとんどのPHP(string)関数にはUnicodeについての手掛かりがありません。各関数のリスクレベルを含む詳細なリストについては、以下を参照してください。 http://www.phpwact.org/php/ i18n/utf-8
http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/
組み込みのメソッドを使用して文字列オブジェクトを作成し、一貫性のない名前とパラメーター化された非オブジェクトのものを置き換えます。例えば.
$subject->replace($search,$replace);
$string->split($separator);
$string->trim();
等.
編集:もう1つ:エンコーディングを処理することを特に目的としたものを除いて、これらのメソッドは常にUTF-8を予期して発行する必要があります。入力が無効なUTF-8の場合、関数の出力がエンコードの影響を受けない場合でも、例外がスローされます。
1)新しくインスタンス化されたオブジェクトが「$ this」を返すようにしたいので、メソッドチェーン$ user = new User( 'john')-> setLastName( 'Doe')-> save();
2)これまでにRubyを使用したことがあり、最近のノードでは、インタラクティブなシェル(IRB)が優れています。私はPHPが実際に役立つものを手に入れたいと思っています。
3)特性/混合ですが、それらは途中であると聞いています。
4)短い配列の2番目にしたい$ myArray = ['my'、 'array'];
5)一貫性のある命名/順序(つまり、針干し草)
1)include()を削除してください。他のファイルへの参照は参照である必要があり、実際に1つのソースコードファイルの内容を別のソースコードに配置しないでください。 PHPプログラマーは、ライブラリを参照する手段としてではなく、関数呼び出しのタイプとしてinclude()を使用しています。これにより、変数の状態や不安定なコードであらゆる種類のあいまいさが生じます。これをPerlのような「use」コマンドに置き換えます。
2)PHPアプリケーションを単一の配布可能なバイトコードファイルまたは実行可能ファイルにコンパイルする標準メソッドを提供してください。これにより、商業開発言語としてのPHPの魅力が大幅に高まります。これは言語の基本的なコンポーネントでなければなりません。アプリケーションのGUIに使用されるhtmlファイルについて心配する必要はありません...
3)PHPタグをHTMLに埋め込む機能を削除してください。または、少なくとも「埋め込みなし」モードを提供します。これは完全な混乱であり、アプリケーションロジックとプレゼンテーションを一緒に混合することにより、悪い設計を助長します。開発者は、表示にテンプレートを使用し、PHPファイルを一緒に平手打ちするのではなく、最高のものを期待する必要があります。
署名済み、
グランドマスターB
pS:ここで他の人が言うことを聞かないでください、私は一年中ニースでした
E_ERROR
を含む文字列であると想定するのではなく、未定義の定数に対するE_NOTICE
へのiniディレクティブ。
初心者にとって意味のある、よく考えられた命名規則でグローバル名前空間を正規化してください!
私たちの最愛のジェフ・アトウッドを引用すると: PHPはうんざりしますが、問題ではありません !
1)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)奇妙な自動型変換をやめる。たとえば、最初に明示的に文字列として型キャストしない限り、SimpleXMLElementオブジェクトをecho
することはできません。または、少なくとも、それが発生したときに何かをスローします(たとえば、厳密モード、またはerror_reporting(-1)
がどんなモードでも)。
9)複数のスレッド、またはある種のイベント/非同期コールバックのサポート。これは、cURLを介して大きなファイルをアップロードしようとする場合に最も重要です。古いskoolスレッドの代わりに、AppleのGrand Central Dispatchのようなものがいいでしょう。または、非同期リクエストを作成してコールバックを定義できるJavaScriptのようなものです。
10)一貫性のある命名/順序(つまり、needle haystack)はいいでしょうが、これはSPLで解決する方が良いと思います。
11)公式にサポートされているインタラクティブなPHPシェル、IRBのような。Facebookにはphpsh
と呼ばれるものがあります。Pythonで書かれていますが、私が見たい洗練されていません。
12)Reflection APIの場合、(a)定数(グローバルおよびクラス)のdocblockコメントのサポート、および(b)PHPDocのようなコメントを適切なデータ構造に解析するサポートを追加します。これを実行しようとする「docblock」と呼ばれるPECLパッケージがありますが、作成者がそれほど遠くに行ったようには見えません。
編集:13)Rubyのように、関数名で!
と?
を使用する機能も見たいです。
文字列 オブジェクトである必要があります
CONSTANT配列を作成/定義する正当な方法を教えてください。この種の機能をシミュレートするためのハックな方法はいくつかありますが、それがPHPの単なる真っ直ぐな機能であるならば、それは素晴らしいでしょう。 Javaの「最終」宣言に似た方法で配列を作成できれば、すばらしいと思います。
セットアップが非常に簡単なログインシステムを作成しました。必要なのは、テキストファイルの配列の内容を変更して、ユーザー情報に必要なフィールドを指定することだけです。 forループのスワスを使用して、フォームの生成や入力の区別からデータベースの呼び出しまですべてを処理しますが、すべてこの元の配列に依存しています。
配列を含むファイルは権限でロックダウンされますが、配列がイーサ内を移動すると、変更可能になります。システムはかなり安全だと思いますが、私は何もチャンスに任せたくありません。配列をファイナライズする方法は、このような状況ではいいでしょう。
新しいアイデア!!
ああ、私は本当にphpで本当に欲しい何かを考えました。 .htaccessが機能するのと同様の方法で、PHPのファイル操作とディレクトリ操作を制御する何らかのシステムが必要です。
.phpaccessファイルは、ある種の同じドメイン/同じOriginポリシーをトリガーする必要があります。
たとえば、仮想ホストを使用して多くのサイトをホストしている場合、ディレクトリに.phpaccessファイルを作成して、保護されたディレクトリで動作しようとしている実行中のスクリプトの元を確認するようにphpに指示することができます。スクリプトがそのディレクトリまたはそのサブディレクトリからのものでない場合、ファイル操作またはソケット操作は拒否されます。
このようなシステムは、仮想ホスティングをより安全な環境にするでしょう。これらのいずれかを各仮想ホストの上部に配置できると、誰かが隣接する仮想ホストから侵入する方法を見つける可能性が低くなります。
また、この方法の逆にそれを保護する方法があるとよいでしょう。つまり、単一のディレクトリ内のスクリプトの範囲をそのディレクトリに制限します。
その陰と陽は知っている!
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」をtrueと見なさないようにする
ハードコアとしての私の2つの最大の望みPHPプログラマー:
言語構文:開発者が興味を持っているものの pihipi と phpreboot にはいくつかの良い手掛かりがあります(phprebootはJSになりすぎますが)。
開発方法論:このような調査を実際に考慮に入れると、PHP.netの寿命が大幅に延長されます。これ以上意地悪な午後をしないでくださいIRCセッション構文の決定。
個々の機能:いくつかは以前に言及されましたが、ここでさらに鈍くするためにいくつかのカルマを喜んで燃やします:
str::toupper()
として使用できる必要があります)\
名前空間構文を廃止し、パーサーを修正して、代わりに::
を採用します。実際の言語のようにね。これが明らかでない場合でも、後者を実行するために他の人に喜んで資金を提供し、メインの実装としてphp.netを終了します。 :P
ああ、気づいたのはコミュニティのwikiです。ですから、あなたが実際にカルマのためにここにいるのではなく、純粋な興味がある可能性があります。その場合は、言語に深刻な影響を与える<b>問題</ b>を調べてください(監督官)。
エラーと例外を1つの概念(例外)に統合したいと思います。例外をキャッチしてログに書き込み、その方法でバグを見つけて修正できるのは素晴らしいことです。ただし、コードパスに根本的に間違っているものがある場合(読み取り:PHPエラー))、ほとんどヒットしないコードパスでは、その情報を同じ問題データベースに流し込むための良い方法はありません。
サンタさん、php.iniにすべてのエラーを例外にするスイッチを導入してください。理想的には、コードでキャッチできる例外です。
PHPは、中小規模のWebサイトをノックアップするのと同じように、私にぴったりです。私は少し想像力に欠けているに違いありません。この質問への回答として私が考えることができる唯一のものは、トラフィックの多いサイトに対してより適切に拡張できるものになるでしょう。
別のプロセスで出力ページを作成しながら1つのプロセスでデータベースを更新するなど、他のコアへのプロセスの生成に関して考えています。簡単なグーグル検索は、これはシミュレートできることを示していますが、現時点ではphpで直接サポートされていません。
スカラー型はオブジェクトとして扱われず、実際のオブジェクトは他の型またはオブジェクトのように動作することはできません(__toString()による文字列を除く)。
http://php.net の「ユーザー投稿ノート」をクリーンアップします。一般的に大きな価値がある一方で、それらは時々本当の混乱です。
PHPにはかなりまともな配列関数がいくつかあり、リスト処理能力を提供し、コールバックとcreate_function()
は基本的なラムダ計算を提供します。
それの主な問題は、PHPで非常に冗長であることです。特にmap/reduceコマンドが関係する場合は、省略形のシステムが優れています。
さらに重要なことに、リスト関数は完全ではありません。
foldr
関数はありません。array_reduce()
はfoldl
を提供しますarray_map()
は、array_walk()
が行うように、2番目の引数でキーを渡す必要がありますarray_map_keys()
はキーの変更に役立ちますrange()
、array_fill()
、およびarray_fill_keys()
は非常に多くのケースのみを処理し、array_filter()
は別個です私はPHPをHaskellに組み込むことを目指していませんが、PHPはリスト型のデータ構造操作に使用され、これにツールの完全なセットを持っていますよろしくお願いします。
オペレーターの過負荷:
$result = $MatrixA + $MatrixB * $MatrixC;
大きなファイルのサポート。きれいにしてください
http://bugs.php.net/bug.php?id=27792 を参照してください(注意が必要な領域/関数が他にもある場合があります)。
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を使用するプログラマーは、OO機能、「goto」を導入しない)を楽しみにしています...それが本当に起こったことがわかったとき、私はエイプリルフールの日だと思った。
オブジェクトモデルを統合する-すべてのオブジェクトが基本オブジェクトクラスを拡張するようにします。 Objectクラスは(とりわけ)すべての魔法のメソッドを実装します(そのため、魔法のメソッドではなくなります!)
拡張機能を独自の名前空間に移動する-グローバル名前空間を整頓する$conn = new \MySQLi\Connection();
spl_autoload()
関数のクリップを解除します!真剣に、これはおそらくPHPの最大の機能の1つであり、同時に最も役に立たない機能でもあります。spl_autoload
はデフォルトのオートローダーで、名前空間と複数のファイル拡張子をサポートしていますが、不明な理由により、ファイル名を小文字にする必要があります。 このためのバグレポート がありますが、下位互換性があるため、スタッフは修正しないと回答しました。右...すべてのフレームワークに独自のオートローダーが付属しているわけではありません。デフォルトのオートローダーが機能しないためです!
汚染サポートを最新バージョンにし、標準ビルドに含めます。できればデフォルトの構成で有効にします http://wiki.php.net/rfc/taint
これにより、人々が適切にコードを作成できるようになり、XSSおよびSQLインジェクション攻撃を防ぐことができます。
PHP=の注釈は素晴らしいでしょう。今後数年間目立つ1つの機能です。この機能は、クリーンなコードで大きなフレームワークを書くのに役立ちます。
else
、while
、およびfor
のforeach
句を確認してください。例えば。:
while (/*condition*/) {
/* display each result */
}
else {
/* condition was never true; display "no results found" message */
}
else
ブロックは、while
の条件がnever trueの場合にのみ実行されます。
これにより、ブールフラグを追跡する必要がなくなり、境界のケースと考えられるエラー条件について考えるのに役立つ可能性があります。
短いオープンタグ、特にecho one =(を削除しないでください。これ:
<?=$myvar?>
...これよりはるかに優れています:
<?php echo $myvar;?>
optionaltype safeについて誰も言及していないようです。
次のようなコードを記述できると便利です。
<?php
$someVariable = 123;
$someVariable = "Hello World";
int $anotherVariable = 123;
////$anotherVariable = "Hello"; // This must cause runtime exception.
////int $lastVariable = "World"; // This must cause it too.
?>
もう一つの例:
<?php
// Current style (which must remain).
function SayHello($howManyTimes)
{
if (!is_int($howManyTimes))
{
throw new Exception('Argument $howManyTimes is invalid. An integer was expected, instead of ' . gettype($howManyTimes) . '.');
}
echo str_repeat('Hello', $howManyTimes);
}
// New, optional, style, allowing to have a shorter code.
function SayWorld(int $howManyTimes)
{
echo str_repeat('World', $howManyTimes);
}
SayHello(123);
SayHello("Hello World");
SayWorld(123);
////SayWorld("Hello World"); // This must cause runtime exception.
?>
次のようなinclude呼び出しからのファイルの名前空間を許可します
include('mytemplate.php', 'MyNamespace');
または
include 'mytemplate.php' use MyNamespace;
そして、接頭辞なしで名前空間をインポート( "使用")できるようにします。
use OtherNamespace as self;
(名前空間接頭辞なしで使用するために個々のクラスをインポートする必要はありません)
ただの夢
ジェネレータ。 Pythonと同様に、yieldを使用します。
__destructorまたは__toStringで例外をスローする機能。そして、本当に、それが不可能である理由は何かありますか?
メソッド内のパラメータのプリミティブ型(ブール値、ブール値、整数値、整数値、浮動小数点数、倍精度浮動小数点数、オブジェクト)を配列として設定できる可能性があればそれでいいでしょう。
例:
電流:
class HttpResponse {
public function __construct($version, $statuscode = HttpStatus::OK, HttpResponseHeaders $headers = array(), $body = '');
}
望む:
class HttpResponse { public function __construct($version, integer $statuscode = HttpStatus::OK, HttpResponseHeaders $headers = array(), string $body = ''); }
また、役立つAssert静的クラスがあると考えました。
すべての型の型ヒントのサポート、および可能なすべての型の_toXXXマジックメソッド。 (phpの一般的な使用法は、型変換を制限するためにIMHOをドリフトさせます/変換float <-> int /などのいくつかの例外を除きます)
メソッドシグネチャを区別するための型ヒントを使用した、確実なメソッドオーバーロード。さらに、ある種のASP.NETスタイルの「属性」を見たいので、PHP MVCフレームワークでのコントローラーアクションは次のようになります。
/* [HttpGet] */
public function login() {}
/* [HttpPost] */
public function login() {}
ネイティブ正規表現リテラル、Perlスタイルの_qw{}
_、_qq{}
_および_q{}
_引用符。
すべてのオブジェクトのチェーンメソッド呼び出し:$object{ ->method1(); ->method2(); ->getPerson()->getName(); }
ステートメント式:_({echo $a; $a = $a + 1; $a})
_
一貫性があり、構成不可能で、_short_open_tags
_をオフにできません。設定できない場合は、PHPコードの移植性が向上します。 [〜#〜] erb [〜#〜] -スタイルタグを含むWHAを参照してください
ホストごとに1つのディレクティブを構成する必要なく、ドメイン名に基づいて仮想ホストにopen_basedirを自動的に設定するネイティブな方法が欲しい(Jason Greeneパッチに似ているが、ネイティブ)。
アプリケーション全体のグローバルをどうぞ!初期化されると、アプリのグローバル変数はすべてのphpスクリプトで使用できるようになります。
それらを閉じずに他のスレッドのセッションを解放するいくつかの方法:
session_start(); $ _ SESSION ['favcolor'] = 'white'; session_flush(); //セッションのブロックが解除され、他のスレッドが使用できるようになります //巨大ループ... $ _ SESSION ['taste'] = 'sweet'; //セッションは自動的に再びブロックされます session_close();
おそらく、ディスク上のキャッシュがいいので、実行を高速化するためにphpスクリプトを手動でプリコンパイルできます。メモリキャッシュに似ていますが、ディスク上のファイルと手動生成(おそらく、いくつかの新しいファイル拡張子を使用)があります。
また、<?php = $ variable?>に似たものを<?php echo $ variable;へのショートカットとして使用します。 ?>はいいでしょう(aspタグと同様ですが、short/aspタグが無効になっています)。
そして、明らかに、get_shutdown_functions()とunregister_shutdown_function()です。現在、それにアクセスする方法はありません。そして、より一般的には、コールバックスタックのいくつかの抽象的なサポート-spl_autoloads、シャットダウン関数、エラーハンドラー(現在はスタックできませんが、おそらく...)などを統合するものです。register_callback($ callback、$ stack)の種類など事前定義されたスタック( 'autoload'、 'shutdown'、 'error' ...)は、phpまたはユーザー自身によって呼び出されます。
リソース(curl、ftp、Gd2 ...)を使用して拡張機能のオブジェクトラッパーを追加する。お気に入り
$oFtp = new Ftp();
$oFtp->connect();
$oFtp->close();
私の最初の2つの不快な点はPHPとは関係ありませんが、暗黙の使用法に関するものです。
ライブラリコード(たとえば、PEAR/Horde/Zend/etc)の「ファイル名拡張子」は、_.phps
_ではなく_.php
_で終わる必要があります。これの利点は、実行するコードと含めるコードが明確に分離されていること、およびオプションですべての(ユーザーの)コードがサーバーからかなり読みやすい/参照できることです。おまけとして、spl_filename_extensions()
を他の人の便宜のためにオートローダーで使用できます。
(ドキュメント内の)規約では、_::
_は静的メソッドとインスタンスメソッドの両方に使用されます。静的に_::
_を使用し、インスタンスに_->
_を使用する場合はありがたいです。良い慣習として、解釈に関するエラーの余地はまだありますが、それは少なくともより明確です。
いくつか例を挙げると、以下も確認したいと思います。
Reflection *のgetDocComment(またはおそらく名前や引数の別のバリアント)は、よりリベラルであり、前述の型の最初のコメント(スペースまで)のみを取得する必要があります。言い換えれば、私は、どのような種類のコメントタイプでも最低限を提供できるようにしたいのですが、詳細(読み取り:行を食べる)文書コメントは好きではありません:_//
_、_#
_、または_/* ... */
_。
使用されている名前空間のリスト。 getdefinednamespaces()
。
「未定義の定数」の動作は、iniディレクティブによって変更できる必要があります。空の文字列または致命的なエラー。それにもかかわらず、暗黙的に文字列に変換されるべきではありません! (JavaScriptの;のようなものです)。
定数___CLASS__
_も、自動的に(静的に呼び出される)_stdClass::__CLASS__ == '\stdClass'
_のように機能します。つまり、文字列でクラスを参照する代わりに、クラスとそのマジック定数___CLASS__
_を使用してクラスを参照したいと考えています。 (はい、それは外接です)
型キャストと魔法のメソッド__fromType($instancetype)
および__toType($type)
。したがって、オブジェクトは整数にキャストできます:$y = (int) $x
または別のオブジェクト$y = (BeanWrap) $x
。それにもかかわらず、これの実装は、8つの異なるタイプをカバーする12の使用可能なキャストのうち、これらのキャストの名前をクラス名(たとえば、int、binary、boolean)として使用できなくなったことを意味します。
このスレッドを見たとき、私が遭遇したいくつかの記事について言及することは有用だと思いました。
notに十分賢く、後方互換性を壊します。 gotoがキーワードとして存在することを一生懸命学びました。メソッド名としてそれを使用していたため、php 5.3のコードの更新に2〜3時間かかりました。
クラスのロールのようなものは、オブジェクトシステムへの良い追加です。複雑なことは何もありません。
class abc { use xyz::method; use uvw::__all; }
これは、クラスxyzからメソッドmethodを、クラスuvmからすべてのメソッドを選択します。
コンストラクタ呼び出しは、作成後すぐにオブジェクトとして使用できる必要があります。
new goodie()->youp();
スカラーをオブジェクトのように扱うことができます。 $ scalar-> toLower();を実行しようとすると、なぜ私が間違っていると言うのですか? 「スカラー」オブジェクトタイプのようなものに一時的にキャストしてから、「未定義メソッド」に移動するのはなぜですか(おそらくこれをnullとして実行しないでください)。
ユーザースペースからリソースを削除します。 PHPにはオブジェクトがあります。リソースになっているものはすべて、プライベートプロパティとして非表示にするオブジェクトラッパーに含めることができます。__sleep()および__wakeup()に機能を追加する必要がある場合があります。ほとんどのリソース「同じような」状態で簡単に再作成できますが、できなくても、PDOオブジェクトはシリアル化できません。他のオブジェクトでも同じことができると思います。
実際のPHPコミュニティがコードを使用して投票できるようにします。既存のメソッド、クラス、および関数を再定義できるようにします。JavaScriptの場合と同様に、不正なコードはローテーションします。人々にPHPを使用すると、常に推測する必要がなく、必要なものがわかります。最も可能性が高いと思われる使用/オーバーライドされた機能と機能を検討する必要があります。
これには、PHPコミュニティにUTF(できればUTF-8)の問題が含まれる)という副作用もあります。ユニコードをオンまたはオフにするシステム全体の設定ではなく、PHP開発者は、アプリケーションだけに必要な機能をオーバーライドできます。
_暗黙の名前空間区切り文字にします。人々はPHP5からそれを使用しています。もしPHP 5.3の場合、書き直さずにコードを構築してください。5.3。それの複雑さはわかりません。最初はコードについていくつかの考えがあることを知っています。 Zend_Exceptionのようなクラス名を使用する:これを許可すると、開発者は常にZend_Exceptionまたは\ Zend\Exceptionとしてアクセスし、決してExceptionにはなりません。1つだけではなくフルネームとして扱います。
OOP:Javascript/Actionscript/Pythonからヒントをいくつか受け取ります。トレイトは有望に見えますが、実行時に動的にタイプを変更することは素晴らしいでしょう。
プロパティ:プロパティに関する作業が進行中のようです。動的に実装してください。 PHPは動的言語であると想定されています。実行時に(ほとんどすべての)プロパティを定義できるはずです。
定数をそれらが使用されているものとして扱います:グローバル変数。クラス/関数/名前空間はすべてこの法案に適合します。多分誰もが今はすべてがグローバルであることを認識し始めたとき、非常に多くのグローバル変数/定数があるという問題を解決するためのアイデアがもっとあるでしょう。
JITコンパイル:JavaScriptはそれを実行でき、超高速です。 PHPは、これの背後にある数少ないものの1つです。
PHPは「ハイパーテキスト」用に最適化されているはずですが、そのように出力をエスケープする簡単な方法はありません。個人的には、htmlspecialchars()を実行するために「印刷」を再定義します。全体として、それは単にprinthまたはechohである必要があるかもしれません。
Php.iniを簡略化します。 php.iniはシステム管理者向けであり、開発者向けではありません。短いタグの非互換性を削除、修正、または削除します。システム管理者がシステム全体の言語機能をオン/オフできるのは面倒です。そして、ソフトウェアを配布しようとするときにそれらを回避します。
PHP開発者がリクエストサイクルの終了後に存在することを許可します(FastCGIおよびApacheの場合)。これをAPI経由で公開します。システム管理者がこれを無効化または制限できるようにします。(phpプログラムが制御を返すように要求します10秒以内にディスパッチャーに送信されるか、永続的なステータスが失われます)。
PHPを一般的なプログラミング言語にします。<?phpタグは煩わしいです:!#/ ...
オブジェクト{}および配列[]を作成するための略語、Tajeは PiHiPi を見て、これと他の多くの単純な構文上の砂糖を実装しています。
14:[]がオブジェクトのプロパティと関数にアクセスできるようにします。関数とクラスは今や一流の市民ですよね?オブジェクトのオブジェクトに動的にアクセスするための事実上の方法(javascript/actionscriptなど)を作成します。
PHPコードをPHPモジュールにすることを許可します。ライブラリを複数のプロセスでシステム全体で使用できるようにするためだけに、Cを学ぶ必要はありません。 PHPコミュニティはこれをもっと理解します。
Java/Cからアイデアをとるのではなく、Javascript、Actionscript、Pythonなどの動的言語からアイデアを取り入れてください。より具体的な機能を以下に示します。
致命的なエラー:ほとんどのエラーがまだ回復できないのはなぜですか?エラーをログファイルに記録するという概念が大好きです(非常に高いレベルで実装されています)。私が嫌いなのは、常に「ホワイトページ」について聞くことです。私はコードで多くのチェックと宣言を行ってこれらを回避しています:しかし、誰かがオブジェクトの代わりにnullを関数に渡すと、神はPHPを作成せずにこのような壊滅的な状態から回復できることを禁止しますis_null()を自分で行います。確かにエラーです。他のほとんどの言語では、これをNullReferenceError/Exceptionと呼んでおり、これを処理して、白い画面以上のものを表示することはできます。
少なくとも、致命的なエラーの追加を停止してください。 PHP 5.2を実行している多くのサーバーをアップグレードできますが、できません:古いコードを修正するために各サーバーの200を超えるサイトを通過する時間がありません。 。追加する新しい致命的なエラーが少ないほど、新しいバージョンのPHPで人々を参加させる可能性が高くなります。
言語から致命的なエラーをできるだけ削除します。 PHPは動的言語であると想定されています。他のすべての言語がほとんどのエラーから回復できるのはなぜですかPHPは致命的と見なされますか?プログラマはエラーを回避できますが、プログラムは、ほとんどの言語がNullReferenceExceptionを考慮した後に強制的に終了します。
例外を再開可能にします。したがって、例外とエラーをより簡単に混在させることができます。
(最も時間がかかり、ほとんどありません)言語のディスカッション、API /モジュールのディスカッション、およびインタープリターのディスカッションを分離します。現在のように統合する必要はありません。現在のインタープリターに関する問題は最後に理解する必要があります。 Pypy/Parrot/JVMはすべて複数の言語をサポートしています。 V8はそうではありませんが、他の言語をJavaScriptにコンパイルしてV8で実行し、その機能を利用するのに十分な速さです。
Interpretter/runtime/vmとして、開発目標は言語とは少し異なります。 PHPを使用すると、同じように感じられます。そのため、他のインタープリターを開発しようとする人々は、言語設計に関するすべてのディスカッションとPHPインタープリターに関するディスカッションが混ざっている場合、ディスカッションについていくのに苦労しています。
通訳者としては、通訳者がサポートする言語が多ければ多いほど良いと思います。 <?python、<?javascript、<?actionscriptを使用できないのはなぜですか。別の言語でコードを書き換えるのに飽きたので、そこで使用することもあります。すでにこれをやろうとしている人もいるでしょう。コミュニティの他の地域からの支持を集めることでしょう。
私の一番の特徴は
私の意見では、ここで求められている繰り返し機能の1つ、つまりオブジェクトとしてのネイティブ型は、独自のラッパークラスを作成することで修正できます。私はプロジェクト用にarrayDataオブジェクト、stringDataオブジェクト、intDataオブジェクトなどを開発しました...これは解決します:
Imho、これは、必要なメソッドの正確な数を取得して、好みに応じて呼び出すことができるため、オブジェクトとしてのネイティブ型よりも有益です。
しかし、私があまり見逃しているのは、オブジェクトでネイティブオペレーターを使用する機能です。 arrayAccessのおかげで、[]演算子を使用できます。しかし、「+」、「-」などを使用することはできません。できれば、stringData + stringData($ string。$ stringと同等)、またはstringData-stringData(str_replace($ str、 'と同等)を使用できます。 '、$ string))、または私のタイプを ">"および "<=" ...と比較します。
現在の実装では、$ intData-> add($ n)、$ intData-> substract($ n)などを使用しています。面倒、特にネイティブのintまたはintDataオブジェクトのいずれかを期待できる関数で。つまり、各関数内のinstanceOfで確認する必要があります。
つまり、私のクラスは準備ができており、最適化されていて、ニースですが、演算子をオーバーロードできるようになるまでは、概念の証明にすぎません。実際のプロジェクトでそれらを使用するのは面倒です。
Zval参照カウントを公開します。 (そうです、 xdebug_debug_zval を使用できますが、ライブサイトでXdebugを有効にします。)使用例:アクティブレコードオブジェクトストア-外部リソース(データベース行など)に対応するモデルがあり、それらのリソースを変更する責任があります。同じリソースに対して2つの個別のオブジェクト表現があると悪い(書き込みの競合によるデータの損失など)ため、要求されたリソースのモデルが既にロードされている場合は、それを返すことができる何らかのキャッシュが必要です。ただし、ガベージコレクションは強制終了されます。モデルオブジェクトへの最後の参照は常にキャッシュに残るため、大きなDBクエリや大きなディレクトリなどの大量のリソースセットを反復すると、メモリがすぐに消費されます。これは、オブジェクトストアが、格納されたオブジェクト(ストア自体)への参照が1つだけであるかどうかを確認でき、そうである場合は破棄できる場合は回避できます。
PHPにいくつかのerlang機能が必要です:
バイトコードの操作:保存、ロード、削除など...
柔軟な埋め込みシステム
最近のPHPの進歩とスケーラビリティが気に入っています。
Javaで導入された新機能は、物事を単純にするのではなく、物事を複雑にするだけです。
リクエスト1:追加ライブラリとしてのdb-connection-pool機能。
リクエスト2:
組み込みのライブラリとして、リバースajaxまたは彗星プログラミングまたはRTMP機能を求めています。これらは、.net、Java、pythonおよびPerl for dojo Foundation向けにすでに開発されています。
PHPにも同様の機能がありますが、完全なソリューションではありません。
またね。
私の日になるいくつかのこと
私は本当にアノテーションが欲しいのですが、RFCが削除されたことを知っています。
$ x = array(5、60、50、50); $ x-> map(function($ i){return $ i * 2;})-> Push(10);
$ p = "文字列"; $ q = $ p-> substring(0、10);
等.
私の意見では、これは現在のグローバル機能を壊すことなく行うことができます。ただし、それらのほとんどは役に立たなくなり、時間の経過とともに廃止される可能性があります。
ループへの参照を渡すforeachループでiterableを拡張するクラスを使用できると便利です。
foreach(&$ myclass as $ me){ echo $ me; }
私はそれが現在動作しない理由を調査するのに多くの時間を費やしていません。おそらくそれはイテラブルがどのように動作するかに関連しており、動作しないことに気付く以上の調査はしていません。
高速関数呼び出し
call_user_func($f,$a1,$aN)
がありますが、$f($a1,$aN)
に置き換えられました。ただし、call_user_func_array($f,$args)
にはそのようなものはありません。
私の提案は、_$f{$args}
_などの特定の言語構文を作成することです。誰もが_call_user_func*
_から1マイル離れた場所にいる必要がある理由は、より良い代替手段があるという意味で非常に遅く、見苦しいためです。
オブジェクトdecleration構文
現在、オブジェクトをその場で作成するには、_(object)array('prop'=>'value');
_が必要です。慣例として、object('prop'=>'value');
も必要です。また、JSONと同様に、短い構文も便利です。
型のためのすべての終わりのすべての魔法の方法
現在、__toString()
があり、提案された多くの___toInt
_/___toFloat
_/etcがあります。私のアドバイスは、__toType()
または__typecast()
を実装することです。これは、最初のパラメーターとして、目的のデータ型が渡されます。例:
_class Test {
public function __toType($type){
switch($type){
case 'integer':
return (int)$this->age;
case 'string':
return $this->age.' years';
default:
throw new EUnsupportedTypeException();
}
}
}
_
より具体的にしたい場合は、$ typeの後に別の引数、つまり$ classを追加できます。したがって、次のことができます:if($class=='person')return new Person($this->age);
foreachでのデータ型の指定
現在、PHP関数の引数のデータ型を次のように指定できます。
_public function say_hello_to(UserClass $user){
$this->say('Hello, '.$user->name.'!');
}
_
これをforeachでも行うとよいでしょう。
_public function on_enter_office(){
foreach($users as UserClass $user) // <- See UserClass here?
$user>say_hello_to($this);
}
_
現在の「修正」は次のようにクロージャを使用しています:
_public function on_enter_office(){
$users->each(function(UserClass $user){
$user>say_hello_to($this);
});
}
_
この修正は、より多くのリソース、より多くの記述、および範囲の混乱を必要とします。そのため、ネイティブソリューションにより、現在の修正よりも簡単で、クリーンで、おそらく高速になる理由がわかります。
条件付き定義
これはおそらく多くの人にとって便利な機能ではありませんが、古いシステムと互換性がある場合でも実行中のコードを最小限に保ち、実行を高速化するための優れた方法です。次のコードを検討してください。
if(!function_exists( 'json_encode')){function json_encode($ value、$ options = 0){//従来のコード}}
// legacy code
_セクションは引き続き解析されるため、そこにエラーがあるとPHPが終了します。修正?条件付きコンパイル:
_#if PHP_VERSION<5.2
function json_encode($value, $options=0){
// legacy code
}
#endif
_
より優れたハイパーテキストリンクのサポート、つまり、ブラウザーのcurrent-uriを変更するために使用できるfunction/class-methodを含めます。またはまったく新しいものを作成します。 $ _SERVER ['REQUEST_URI']を使用|| $ _SERVER ['PATH_INFO']は、要求されたリソースを理解します。これにより、RESTアプリの開発などが容易になる場合があります。 (rfcのUriSchemeとデフォルトのスキーム実装によると、おそらくUriBaseを拡張する他のUriSchemesを実装できるようになります)
UriResourceクラスのようなものを提供して、クライアントからのhttpリクエストにも利益をもたらすような方法で機能の小さなスニペットをリクエストできるようにします。
テンプレートの前後に呼び出すことができる関数を作成し、2つの関数呼び出しの間の短いタグを有効にします。それらの関数呼び出しの間で、使用可能にされる唯一の変数は、最初の関数呼び出しに渡されたものです(抽出を使用した連想配列として)。これにより、php自体(フレームワークなしのフレームワーク)でのテンプレート開発が容易になります。 no-framework PHP MVCフレームワーク
全体的に見て、多くのphpフレームワークには共通の方法で簡単にphpに統合できる特定の類似点があると思います。
しかし、whoami :)