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. 静态属性$property_one在 class 中声明,BA的构造函数将无法访问该属性,您也不能保证该属性存在。
    诚然,自 PHP 5.3 起,支持后期静态绑定,但这并不会改变这样一个事实,即您永远无法确定某些恰好被调用的静态属性,无论$this->property发生什么分配。如果它被分配了一个对象怎么办?整数还是浮点数?
  2. 您可以像这样访问静态属性:static::$properyself::$property. 注意$!当您编写时static::$this->property,您期望 this 评估为self::property_one. 你显然错过了这个$标志。
    您最不需要的是self::${$this->property}. 检查变量变量的 PHP 手册。
  3. 您试图从构造函数返回一个字符串,这是不可能的。构造函数必须必须返回类的实例。任何不返回的语句都将被忽略。

要在构造函数中访问子类的静态属性,您不能不依赖子类的构造函数:

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 回答