なぜPHP関数のシグニチャーはそれほど矛盾していますか?[閉まっている]


17

私はいくつかのPHP関数を試していましたが、次のことに気づかずにはいられませんでした。

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

array_key_exists()and property_exists()関数に注目してください。最初のものでは、プロパティ名(配列のキー)が最初のパラメーターであり、2番目のものでは2番目のパラメーターです。直観的には、彼らは同様の署名を持っていることを期待するでしょう。これは混乱を招く可能性があり、このタイプの修正を行うと開発時間が無駄になる可能性があります。

PHPやそのような言語は、関連する関数の署名の一貫性を考慮すべきではありませんか?


2
+1ブラボー、これは私がphpについて最初に気づいたことの1つであり、常に迷惑であることがわかりました
ケビン

えー IDEを使用します。
ベンデュビュイソン

回答:


10

提案するのは、本質的に署名を多くの既存の機能に変更することです。既存のコードにどのような影響があるかを少し考えてください。ここで、PHPグループが、関数の30%のシグネチャを変更するPHPバージョンNをリリースしたとします。ここで、PHP vNとPHP v。{N-1}の両方で実行されるコードを作成する必要があると想像してください。

今、あなたがホスティング会社または企業のデータセンターマネージャーであることを想像してください-PHP vNをサポートするために必要なインセンティブは、一度切り替えると、すべてのコードが破損し、ユーザーが熊手とトーチでオフィスに来るということですか?


4
+1間違った方法で何かを始めたら難しいですが、現在の状態で非常に大きなユーザーベースを使用しています。
アンディフレミング

4
それは良い点です。私は実際にこれを知っていましたが、私の主なポイントは、彼らがそもそもこれを知っていたはずだということです。
シャミムハフィズ

7
@Shamim True。これは、PHPがそもそも評判が悪い理由の一部です;)
アンディフレミング

1
PHPは、非常に多くのものと同様に、小さな問題を解決するための小さなツールとして始まりました。それが「適切に」設計されていた場合、それよりも優れているかもしれませんが、トラクションに達していない可能性があるため、誰もそれを使用しません...と別の小さなツールは「ウォン」、異なる矛盾とツールを持っているでしょう...
ヨハネス・

3
それが非推奨のようなものがある理由です。新しい標準化された名前を作成し、関数名の古い「サラダバー」を廃止しますが、いくつかのリリースでは残します。十分に公表された時点で、それらを廃止した新しいメジャーバージョンリリースが出てきます。これがこれが行われる方法です。PHP開発者がこれを行っていないのは、純粋なco病者です。彼らは、PHPが他のWeb言語よりも優位に立つ低障壁に乗っているため、成功しているため、コア言語を改善し続ける必要はありません。
ダン・レイ

10

PHPは仕様のない言語だからです。

そして、文字通り誰もがいくつかの機能を追加することができ、最初は一貫性の問題はありませんでした。だから、混乱。


誰もが機能を追加することができます
StasM

@StasM:DEVグループは誰にできますか?そのグループの運営方法を見つけることができるリンクはありますか?
シャミムハフィス

@StasM:わかりました、少し誇張しました。本当の問題は、コードの結束の責任を負い始めた人または一人の人からの慣習の欠如です。今は手遅れです。PHPを別の言語として文字通りフォークせずに変更できるかどうかは疑問です。
ts01

@Shamim Devグループの運用原則は、コンセンサスとコンフィアンスの2つです。これはクールですが、私は良い言語発達のためには十分ではないかと思います
TS01

@Shamim:php.netとwiki.php.netから始めます。
StasM

4

ほとんどの優れた言語は、一貫性を保つよう努めています。

これは、PHPの現状です。StasMが述べたように、事実の後にそのようなことを試して切り替えようとするのは悪夢です。既存のコードに影響を与えすぎます。多くの場合、PHPは単純に関数を非推奨にし、より一貫性のある新しい関数を作成しますが、これには多くの時間がかかります。

成功したPHPプログラマーは、特定の構文を覚えているか、構文を自動的に伝えるソフトウェアを使用していると思います。


非推奨機能は、簡単なことです。引数の順序を変更すると、より多くの、より困難である
TS01

@ ts01は本質的な問題を解決します。位置パラメータのみfoo(a,b)ではfoo(b,a)、誰かがfooの署名を変更したために、既存のものが今あるべきかどうかを知る方法がありません。
フランク・シェラー

@ ts01、@ Frank:関数の名前も変更する必要があります...「property_exists」のような他の適切な名前ないものについては、特に良い考えではありません。個人的には、配列が実際のオブジェクトになるようにしたいので$array->key_exists('whatever')、言うことができますが、まあ:
ディーンハーディング

実際、PHP開発者ができることは、これらをラップする独自の新しい関数を作成することです。また、isset()には、上記の両方の例に共通の構文がありますが、コンパイルされた仕様の一部として非推奨ではないことに注意してください。
user1122069

3

矛盾の主な原因は、組み込み関数のphpの多く(ほとんど?)が実際にはCライブラリのラッパーであるということです。最初の考え方は、「C関数xxxxをラップしているため、パラメーターの順序を同じに保つ必要がある」というものでした。「純粋なphp」関数を作成することになると、この考え方は「xxxxがファイルとオプションを取得する」に拡張され、新しい関数はファイル名とオプションを取得するため、yyyyが同じ順序で同じパラメーターを取得するのが理にかなっています。

ここでの大きな欠点は、基礎となるCライブラリが最初から非常に矛盾していることです。


また、ラップしているC関数名(特にstr関数)を保持し、他の関数名に対するCの命名規則(など)から大きく逸脱しています。
ダン・レイ・

2

(a?)理由は、以前のバージョンのPHPとの互換性を維持するためです。多くのアプリケーションを破壊する関数名を変更する代わりに、関数は残ります。ただし、直観的には、新しい言語では一貫した関数命名を考慮する必要があります。

開発時間が無駄になるという事実について、私はあなたに反対しなければなりません。PHPの学習は、特定の関数の名前付けを理解するのに時間がかかる場合がありますが、習得(または少なくとも認識)すると問題になりません。

互換性>一貫性(少なくともPHPに対して)


1
他の言語では、ドキュメントを常に参照せずに記述できます。PHP常に心配する必要があります...この関数のスペルは「s​​tr_」ですか、それとも単に「str」ですか?これは「array_」なのでしょうか、それとも配列について言及していませんか?文字列が与えられたときに「length()」は何をしますか?ああ、いや、それは私が本当に欲しかった「strlen()」です...「針、干し草」または「干し草、針」ですか?他の言語では、それをすべて理解することはできません。
ダン・レイ

あなたのように、私は常にこの@DanRayに悩まされていました。NetBeans PHP IDEの使用を開始しましたが、エディターで必要な正確な情報が得られます。
-deed02392
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.