web-dev-qa-db-ja.com

PHPで内部クラスを使用するにはどうすればよいですか?

私はJavaバックグラウンドで、PHPで内部クラスを使用したいのですが、内部クラスを配置するたびに構文エラーが発生します。これはPHPで可能ですか?また、 、外部クラスをどのように参照しますか?そのすべてのデータメンバーにアクセスできますか?

<?php

class OuterClass {
    var $x = 15;
    function __construct() {

    }

    class InnerClass {                  // error when InnerClass is static
        function __construct() {        // error when InnerClass is static
            echo $x;
        }
    }
}

?>

これは、特定のカードゲームのMoveClass(移動の場合と同様)に使用されます。これらのクラスは、意味をなさないので、一緒にまとめるのは良いデザインだと思います。また、MoveClassはGameクラスの一部のデータメンバーについて知っている必要があります。機能させてみませんか?単に大きすぎます。

編集:

ネストされたクラスはどうですか?私が理解していることから、それらは静的である必要がありますか? O_o

32
Lindz

PHPは内部クラスを許可していません。親クラスからすべてのデータメンバーにアクセスする場合は、継承を使用することをお勧めします。

可能な代替:

class OuterClass {
    var $x = 15;
    function __construct() {

    }
}
class ChildClass extends OuterClass {
    function __construct() {
        parent::__construct();
    }
}

クラス自体を参照することにより、親クラスからメソッドを呼び出すことができます。 PHPでは、parentキーワードを使用してこれを行うことができます。したがって、オブジェクトではなくクラスのコンテキストでメソッドを参照するには、::を次のように使用します->とは反対です。

20
Russell Dias

PHP 5.4以降では、PHP多重継承向けに設計されたトレイトを使用できますが、ニーズに合う可能性があります。PHPドキュメント:

トレイトはクラスに似ていますが、機能をきめ細かく一貫した方法でグループ化することのみを目的としています。特性を単独でインスタンス化することはできません。これは、従来の継承への追加であり、動作の水平構成を可能にします。つまり、継承を必要としないクラスメンバーのアプリケーションです。

http://php.net/manual/en/language.oop5.traits.php

5
Jason

この答え へのコメントで言及されているように、 別の質問 からPHPこの機能のバージョンがPHP 7.それはあなたが求めているものを正確に提供しているようには見えませんが、同様のデザインパターンを提供するはずです。

これがどのように機能するかを説明するRFCは次のとおりです。 https://wiki.php.net/rfc/anonymous_classes

他の回答のコメントで述べたように、RFCページで「ネストされた」を検索して、外部クラス内でのネストの例を確認してください。

2
jason

代わりにstdClassを使用することもできます。 SOそれについての質問です: PHPのstdClassとは)

1
mqsoh

そのようなクラスをネストすることはできません。

マニュアル の「拡張」セクションをご覧ください。

0
simshaun