0

クラスの静的プロパティを別のクラス内で呼び出すことに問題があります。

Class A {

    public $property;

    public function __construct( $prop ) {
        $this->property = $prop;

    }
    public function returnValue(){
        return static::$this->property;
    }

}

Class B extends A {

    public static $property_one = 'This is first property';
    public static $property_two = 'This is second property';

}

$B = new B( 'property_one' );
$B->returnValue();

戻ることを期待してThis is first propertyいますが、出力は__constructのパラメーター入力の名前にすぎません。

出力がprint_r( static::$this->property );ちょうどproperty_one

4

3 に答える 3

1

もしかしてこんな?

<?php
Class A {

    public $property;

    public function __construct( $prop ) {
        $this->property = $prop;
        print static::${$this->property};
    }
}

Class B extends A {

    public static $property_one = 'This is first property';
    public static $property_two = 'This is second property';

}

$B = new B( 'property_one' );

(つまり、この方法でプロパティにアクセス(印刷、...)できますが、コンストラクターはとにかくオブジェクトを返します。)

于 2013-10-22T09:52:42.797 に答える
1

変更するだけです:

return static::$this->property;

と:

return static::${$this->property};
于 2013-10-22T09:52:43.483 に答える
1

ここにはいくつかの問題があります。

  1. static プロパティ$property_oneが class で宣言されているB場合、Aクラスのコンストラクターはそのプロパティにアクセスできず、このプロパティが存在することを保証することもできません。
    確かに、PHP 5.3 以降では、レイト スタティック バインディングがサポートされています$this->property。オブジェクトが割り当てられている場合はどうなりますか? int、またはフロート?
  2. 次のように静的プロパティにアクセスします:static::$properyまたはself::$property. に注意してください$。を書くときstatic::$this->property、これが に評価されることを期待していますself::property_one。あなたは明らかに$サインを見逃しています。
    最低限必要なものはself::${$this->property}. 可変変数に関する PHP マニュアルを確認してください。
  3. コンストラクター関数から文字列を返そうとしていますが、それは不可能です。コンストラクターは、クラスのインスタンスを返す必要があります。そうでない return ステートメントは無視されます。

コンストラクターで子クラスの静的プロパティにアクセスするには、子のコンストラクターに頼らざるを得ません。

Class A
{
    public $property;
}

Class B extends A
{
    public static $property_one = 'This is first property';
    public static $property_two = 'This is second property';
    public function __construct( $prop )
    {
        $this->property = $prop;
        print self::${$this->property};
    }
}
$B = new B( 'property_one' );

別の方法は次のとおりです。

Class A
{
    public $property;
    public function __constructor($prop)
    {
        $this->property = $prop;
    }
    public function getProp()
    {
        return static::${$this->property};
    }
}

Class B extends A
{
    public static $property_one = 'This is first property';
    public static $property_two = 'This is second property';
}
$B = new B( 'property_one' );
$B->getProp();
于 2013-10-22T09:54:51.880 に答える