2012-02-28 8 views
4

PHPでは、return selfで静的メソッドを連鎖させることはできません。連鎖は非常に便利で、インスタンスを使用してメソッドを連鎖させる必要があるため、これは静的メソッドの使用を制限します。PHPでselfを返すことができないのはなぜですか?

PHP開発者が返信を許可しない理由がありますかself?あるいは、一般的にOOPにselfを返すことはできませんか?

+5

、チェーンはに過剰に使用されています誰もが思っているように読みやすさに影響を与える点クリーンで読みやすいコードの目的は、最長のチェーンを可能にすることです(同様に、人々は入れ子構造の三項を冷静な場所で考えていました)。とにかく、ここを参照http://stackoverflow.com/questions/125268/chaining-static-methods-in-php – scibuff

+0

私はそれが個人的な好みの問題だと思う。 –

+7

静的メソッドをチェーンする必要がある場合は、おそらく設計ミスを起こしている可能性があります。 – Crozin

答えて

1

あなたと関係のない誰かが自分をあきらめて、存在しなかった何かにあなたを戻すように頼んだら、あなたはどう思いますか?

+26

幸いなことに、PHPは一日に何百万回も「死ぬ」と言われているので、何の気持ちもありません。 – CodeCaster

+6

ハハあります。爆発も! – Luc

2

私が知っているOOP言語が型として型を返すことを許していないので、 'self'を返すことはできません(それを言い換える方法はわかりません)。しかし誰もがのインスタンスを返します。静的メソッドはクラス定義の一部であり、アプリケーションが実行されている間は呼び出し可能です。

OOPを実行する際には、staticキーワードを非常に慎重に使用する必要があります。非常に簡単に使用できるためです。メソッドを連鎖させたい場合は、オブジェクトを使用します。静的メソッドは、状態が不要な場合はのみを使用し、関数は単に入力を処理して結果を返します。

連鎖するときは、状態を維持する必要があります。静的なクラス/メソッドはまったく使用しません(いくつかのケースがありますが、例外ですが、ここではそうではありません)。

+1

PythonやRubyでは、 'return cls/self'はクラスメソッドでうまく動作します(実際にクラスはこれらのクラスや他の多くの言語ではファーストクラスのオブジェクトです)。 –

+0

私はpythonもrubyも知らない。しかし、静的なクラスをそれ自身として返すことは、私にとって奇妙なことですが、いくつかの文字を入力するだけで済みます。 – MikeSW

+0

MikeSW:そうするのは賢明だとは言いませんでしたが、少なくともオブジェクトベースの言語では可能です(すべてのオブジェクトが型を含むオブジェクトベースなのでオブジェクトベースです)。 –

3

理由がわかりませんなぜ以外の構文自体はサポートされていません。それはほとんどPHP 5.3で仕事ができる:PHPはFoo::A()::B()を解析したい場合、それがうまくいく

class Foo 
{ 
    public static function A() 
    { 
    return __CLASS__; 
    } 

    public static function B() { } 
} 

$chain = Foo::A(); 
$chain::B(); 

0

return new static()またはreturn new self()を試してみてください。これは、チェーンの静的メソッドを使用することができる

class Calculator 
{ 
    private static $_var = 0; 

    public static function startFrom($var) 
    { 
     self::$_var = $var; 
     return new static(); 
    } 

    public static function add($var) 
    { 
     self::$_var += $var; 
     return new static(); 
    } 

    public static function sub($var) 
    { 
     self::$_var -= $var; 
     return new static(); 
    } 

    public static function get() 
    { 
     return self::$_var; 
    } 
} 

:正直に言うと

echo Calculator::startFrom(10) 
    ->add(5) 
    ->sub(10) 
    ->get(); // return 5 

New self vs. new static

関連する問題