4

構築中に機能を提供することになっている(抽象)親クラスがあります。子クラスは、コンストラクターで使用されるプロパティをオーバーライドできます。

class Parent extends MiddlewareTest
{
    // abstract channel properties
    protected $title = NULL;
    protected $type = NULL;
    protected $resolution = NULL;

    function __construct() {
        parent::__construct();

        $this->uuid = $this->createChannel($this->title, $this->type, $this->resolution);
    }
}

class Child extends Parent
{
    // channel properties
    protected $title = 'Power';
    protected $type = 'power';
    protected $resolution = 1000;
}

問題は、オーバーライドされていない実行時にオーバーライドされたプロパティが使用されないことChild::__construct()です ($this->createChannelがパラメーターで呼び出されNULLます)。

これは PHP で可能ですか、それとも必要な機能を提供するために毎回子コンストラクターをオーバーライドする必要がありますか?

注: php で子クラスと親クラスの間でプロパティが共有されているのを見ましたが、子プロパティはコンストラクターではなく定義によって割り当てられるため、これは異なります。

アップデート

私のテストケースに欠陥があることが判明しました。MiddlewareTest は SimpleTest ユニット テスト ケースに基づいていたので、SimpleTest は実際には (私が認識していなかったことに)、自動実行によって意図されていない Parent クラス自体をインスタンス化していました。Parent クラスを抽象化することで修正されました。

得られた教訓: クリーンなテスト ケースを作成し、助けを求める前に実際に実行します。

4

1 に答える 1

2

あなたのサーバーでそれがどのように起こっているのかわかりません。クラスについて仮定し、MiddlewareTestクラス名を変更し、いくつかの簡単なデバッグ行を追加する必要がありましたが、次のコードを使用します。

<?php
/**
* I'm not sure what you have in this class.
* Perhaps the problem lies here on your side.
* Is this constructor doing something to nullify those properties?
* Are those properties also defined in this class?
*/
abstract class MiddlewareTest {
    // I assume this properties are also defined here
    protected $title = NULL;
    protected $type = NULL;
    protected $resolution = NULL;
    protected $uuid = NULL;

    public function __construct()
    {}

    protected function createChannel($title, $type, $resolution)
    {
        echo "<pre>" . __LINE__ . ": "; var_export(array($this->title, $this->type, $this->resolution)); echo "</pre>";
        echo "<pre>" . __LINE__ . ": "; var_export(array($title, $type, $resolution)); echo "</pre>";
        return var_export(array($title, $type, $resolution), true);
    }
}

// 'parent' is a keyword, so let's just use A and B
class A extends MiddlewareTest
{
    // abstract channel properties
    protected $title = NULL;
    protected $type = NULL;
    protected $resolution = NULL;

    function __construct() {
        parent::__construct();

        echo "<pre>" . __LINE__ . ": "; var_export(array($this->title, $this->type, $this->resolution)); echo "</pre>";
        $this->uuid = $this->createChannel($this->title, $this->type, $this->resolution);
        echo "<pre>" . __LINE__ . ": "; var_export($this->uuid); echo "</pre>";
    }
}

class B extends A
{
    // channel properties
    protected $title = "Power";
    protected $type = "power";
    protected $resolution = 1000;
}

$B = new B();
?>

次の結果が得られます。

37: array (
  0 => 'Power',
  1 => 'power',
  2 => 1000,
)

20: array (
  0 => 'Power',
  1 => 'power',
  2 => 1000,
)

21: array (
  0 => 'Power',
  1 => 'power',
  2 => 1000,
)

39: 'array (
  0 => \'Power\',
  1 => \'power\',
  2 => 1000,
)'

ご覧のとおり、期待どおり、値はインスタンス化されたクラスで定義されているとおりに渡されます。

この動作が発生している理由を明らかにする可能性のある MiddlewareTest クラスの詳細を教えてください。

どのバージョンの php を実行していますか?

于 2013-08-01T16:48:30.007 に答える