2011-06-22 3 views
1

クラスと関数名をペアにするのは悪い習慣と考えられますか?クラスとペアになっているPHP関数名

たとえば、コナナでは次のことができます。

function Model($a,$b){ 
    return new Model($a,$b); 
} 

それから私は、新しいへのすべての参照をドロップすることができなかったの$ temp変数を作成する必要はないだろう、と何の工場出荷時の混乱。

$book = Model('book')->where('title','=','name'); 

$temp = new Model('book'); 
$book=$temp->where('title','=','name')->find(); 

それとも

$book = Model::factory('book')->where('title','=','name'); 

私はグローバルな環境汚染が悪い理解し、最初に読むために少しあいまいですが、それはそれは利点のしています。

他の人がクラスと関係のない関数を定義していた場合、関数を使用しないのはなぜですか?例えば

$book = new Model('book'); 
// looks so close to the above, it's scary 
$book = Model('book'); 

他の長所や短所?

+1

あなたはPHP言語が好きではありませんので、あなたはそれを回そうとしています。あなたは、そのモチベーションを使って別の言語を学ぶ素晴らしい機会を逃しています! – Joe

+0

安全な4文字に3つの醜い名前を書いてみて、コードを書く人々の混乱を混乱させるようにしてください( "newに加えてその機能は何ですか?")? Edit @Joe:最後に私がチェックした時、クラスインスタンシエーションのための 'new'がかなりの言語で必要でした。 PHPの設計について多くのことを批判することができますが、これは重要なものではありません。 – delnan

+1

私は新しい構文についてPHPを批判していませんでした。ちょうど一般的。 – Joe

答えて

1

私は時折それを行います。コードを読みやすくすることがあります。

これは工場手続きと呼ばれています。しかし、彼らがそれほど浅いのであれば、ほとんどの意味があります。たとえば、パラメータに応じて、このような方法は、異なるオブジェクト(代替プレースホルダ/スタブオブジェクト)を返す可能性がある場合:

class User { ... } 

function User($id) { 
    return ($id < 0) ? new PlaceholderUser() : new User($id); 
} // or another *stub object* to support the application flow 

しかし、もちろんあなただけのよりよいルックスのためにそれを使用することができます。これは基本的に、静的な工場の一般的な方法よりも賢明なアプローチです。しかし、私は本当にたくさん使うオブジェクトのためにそのようなラッパー関数を予約します。既存の各クラスのラッパー呼び出しで関数スコープを埋めるのは意味がありません。

一般的な批判は:経験の浅い開発者は、newのないオブジェクトのインスタンス化によって簡単に混乱することがあります。 (それが本当かどうかはわかりませんが、それはよくこの文脈で言います)。

0

これは、コンストラクタがPHP v5より前に(つまり、 "__construct"という名前ではなく)動作するため、おそらくそれを望まないためです。

(編集:あなたの質問に誤解は、無視私は、関数がグローバルスコープで定義されていたことをキャッチしていない。)

+0

ありがとう私はphp(去年かそう)にはかなり新しいので、それはまだ知っている興味深いです。 – William

0

IMHO、これはPHPの誤った機能です!私は識別子がそのネームスペース内で本当に一意でなければならず、それがクラスか関数かを区別すべきではないと思います。同様のことは、プロパティとメソッドのPHP(任意の?)の区別になります。 (これまでオブジェクトのプロパティとして格納されたクロージャを呼び出そうとしましたか?)

誰かがこれらの特性を明らかにすることができますか、醜いハッキングを許す限り、私にはメリットはありません。

このような手法を使用することを強くお勧めします。私はPHPの本(または公式のリファレンス)を見たことがないので、識別子のこの "衝突"を明示的に言及しています。 (私が間違っていれば私を訂正してください)、一般的に知られていないと思います。マリオがすでに述べたように、私はこれが混乱し、誤解を招くと主張します。

私はModel()関数が実際に何かをすることを期待しています。その定義には、誰かがnewと変数を使用するにはあまりにも怠惰であることを知るために怒っています。

+0

ええ、私はそれがどこにも言及されていないことに気づいた。私はそれがどこでもスタックオーバーフローでphp.netまたはここで言及したことを見ていない。私は、クラスが導入されたときに、関数との以前の名前の衝突を避けて、別々の名前空間でそれらを作成したかったと仮定しています。面白いバックスラッシュを使った '名前空間'が別の名前空間を汚染することさえも面白いです。関数、クラス、そして現在はすべて同じ名前の名前空間を持つことができます。 :)。ハッキングに最適です。 – William

関連する問題