2009-08-14 22 views
6

私はphpメソッドがC++でよく行われるので、クラス本体の外部で定義されているのだろうかと思います。この質問はDefining class methods in PHPと同じです。しかし、私は彼の元の質問は '定義'の代わりに '宣言'をしていると考えていますので、すべての回答はちょっと不適切です。クラスの外で定義されたメソッド?

更新:

はおそらく定義と宣言の私の考えは不備ました。しかしによってクラス本体の外側を定義し、私はC++

class CRectangle { 
    int x, y; 
    public: 
    void set_values (int,int); 
    int area() {return (x*y);} 
}; 

void CRectangle::set_values (int a, int b) { 
    x = a; 
    y = b; 
} 

と同等のものを意味し、PHPコードのすべての例は、C++インライン化機能などのクラス本体内のコードを持っています。たとえPHPの2つの機能に違いがない場合でも、スタイルの問題です。

+0

のような質問があります。 –

+0

"declare"と "define"の違いを定義してください;) – matpie

+0

私はこの質問に対する答えはわかりませんが、私は同意します他の質問で*の*を間違って使用すると、答えを解釈する方法を知ることが難しくなります。これまでの回答ではこれをクリアしていません。 – Darryl

答えて

4

私の知る限り、ヘッダーファイルのメソッドの宣言は、C/C++独自のものです。私が知っている他のすべての言語は、それを全く持たないか、限られた形式(JavaやC#のインタフェースなど)しか持たない。

0

いいえ。その質問では、 '宣言'と '定義'は入れ替え可能と考えることができます。

1

これは可能ですが、非常にハッキーなのでおすすめしません。それをする理由もありません。

1

まず、PHPではすべてのクラスメソッドをclass構造体(class x { })内に定義して実装する必要があります。これは、C++のようなものではなく、定義(*.h)とは別の実装(*.cpp)を持っています。

6

ここでは決して使ってはいけないひどい、醜いハックだ。しかし、あなたはそれを求めました!

class Bar { 
    function __call($name, $args) { 
     call_user_func_array(sprintf('%s_%s', get_class($this), $name), array_merge(array($this), $args)); 
    } 
} 

function Bar_foo($this) { 
    echo sprintf("Simulating %s::foo\n", get_class($this)); 
} 

$bar = new Bar(); 
$bar->foo(); 

私は何をしましたか?とにかく、新しいメソッドを追加するには、クラス名とアンダースコアの接頭辞を付けます。関数の最初の引数は$thisへの参照です。

2

クラスメソッドの宣言と実装を分離する方法を探しているうちに、この質問に遭遇しました。どうして?コードの可読性のため。宣言が別ファイルまたはクラスファイルの先頭にある場合、そのクラスを使用しようとする人は、どのメソッドが提供されているかを知るために実装全体を巡回する必要はありません。

私は何か便利なものを見つけました:PHPインターフェイスクラス。私は彼らがそれのために設計されているとは思っていませんが、彼らは目的に役立ちます:インターフェイスクラスはすべてのメソッドを定義し、その後、 "本当の"クラスがそれらを実装します。ここではそれについての記事があります:

http://www.davegardner.me.uk/blog/2010/11/21/why-you-should-always-use-php-interfaces/

1

ネイティブ PHPは、このような機能をサポートしていませんが、PHP5.4以降、あなたはオブジェクトに動的メソッドを追加することができます。たとえば、https://github.com/ptrofimov/jslikeobject

関連する問題