0
abstract class BaseController
{
    protected $arctica, $database, $content, $cacheTime;

    function __construct($arctica)
    {
        $this->arctica = $arctica;
        $this->config = $arctica->config;
        $this->database = $arctica->database;
    }

class Controller extends BaseController
{
    protected $cacheTime = 2;
    protected $database = 'override'; //trying to override database var

    function __construct($arctica)
    {
        parent::__construct($arctica);
    }

    function Run()
    {
                    var_dump($this->database); //A class instance, not string('override')
        $this->load('homepage');
    }
}

このクラスについていくつかお聞きしたいことがあります。

Q1:に到達したい場合$database variable of child class、どうすれば到達できますか?

Q2:$database variable in parent class自分自身であっても、子クラスによって変更/オーバーライドできないようにするにはどうすればよいですか? ($database は、データベース インスタンスを保持する定数である必要があるため、Controller の子はそれに触れてはなりません。) 今はそのようになっていますが、理由がわかりません。

Q3:作成した変数にパラメーターを追加するにはどうすればよいですか? 同様に、保護された $var の代わりに、 protected const $var私にとってより意味があります。PHPがサポートしていないだけなのか、OOPではまったくサポートされていないのでしょうか? (多分それはサポートされているのですが、方法がわかりませんか?)

Q4:親クラスでメソッドを定義した場合、$this なしで到達できますか? のようにload('homepage')

どうもありがとう!

4

3 に答える 3

1

コードは、$arcticaオブジェクトからデータベース情報を取得します。そこにある情報が使用され、抽象クラスの保護変数も拡張クラスも使用されません。

保護された変数を存続させたい場合は、独自のバージョンの を作成して__construct()これを変更する必要があります。おそらく次のようになります。

public function __construct($arctica) {
    parent::__construct($arctica);
    $this->database = "override";
}

Q1: たどり着けますか?

Q2: 保護された変数で強制することはできません。これを行うものをコーディングしないでください。これを実現するには、ゲッターとセッターを使用できます。

Q3: PHP はこれをサポートしていません。

Q4: いいえ$this。 オブジェクト内で PHP を使用する場合、PHP は常に独自のインスタンスで動作する必要があります。

于 2013-03-15T12:15:51.320 に答える
0

Q1:子クラスの$ database変数に到達したい場合、どうすれば到達できますか?

宣言されている場合は、親または子のいずれかからprotectedアクセスします。$this->database

の場合はprivate、を介してアクセスします$this->databaseが、親からのみアクセスします。

Q2:親クラスの$ database変数が、自分自身であっても子クラスによって変更/オーバーライドされないようにするにはどうすればよいですか?

あなたはそれを宣言することができますprivate。しかし、私の意見では、使用privateはコードの臭いです。むしろ、それらを2つの別々のクラスにして、構成を通じてそれらを組み合わせる必要があります。

Q3:作成した変数にパラメーターを追加するにはどうすればよいですか?

どういう意味かわかりません。

Q4:親クラスでメソッドを定義した場合、$ thisなしでメソッドに到達できますか?load('homepage')のように。

できません。これがPHPの仕組みです。

于 2013-03-15T12:13:34.943 に答える
0

A1 :BaseControllerその子クラスの属性に到達できません。BaseController子供がいることも知りません。それを作成しabstract、その子にゲッターを実装させて、ゲッターBaseControllerを介して属性値にアクセスできるようにすることができます。

A2 :アクセスできるようにしてdatabaseください。次に、保護されたゲッターを定義して、子クラスが直接ではなくゲッターを介してアクセスできるようにします。BaseController privateBaseControllerBaseControllerdatabase

A3final : PHP には、たとえば Java にあるようなキーワードはありません。PHP はキーワードを認識してconstいますが、これは「一度書かれたものは二度と書かれない」という意味とは異なります。のマニュアルを参照してくださいconst

A4 : いいえ、また言語制限です。$thisPHP がなければ、メソッドまたはプロパティにアクセスする必要があることを認識できません。グローバル関数またはローカル変数 (作成される) にアクセスすることができます。

于 2013-03-15T12:17:08.767 に答える