【问题标题】:Call static properties within another class in php在 php 中调用另一个类中的静态属性
【发布时间】:2013-10-22 09:42:30
【问题描述】:

我在调用另一个类中的一个类的静态属性时遇到问题。

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

【问题讨论】:

  • 您正在实例化A,它永远不会设置或访问$property_one。所以永远不会返回预期的结果
  • 对不起,我编辑了帖子,实际上那是在实例化 B。抱歉打错了。
  • 你不能在构造函数中返回值,new B 总是给你一个对象
  • 我编辑了帖子,目标是我想从 returnValue 方法中获取静态 $property_one 的值。

标签: php oop static dynamic-variables late-static-binding


【解决方案1】:

只是改变:

return static::$this->property;

与:

return static::${$this->property};

【讨论】:

    【解决方案2】:

    可能是这样的?

    <?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' );
    

    (我的意思是你可以通过这种方式访问​​(打印,...)属性,但构造函数无论如何都会返回一个对象。)

    【讨论】:

    【解决方案3】:

    这里有几个问题:

    1. 静态属性$property_one 在类B 中声明,A 类的构造函数将无法访问该属性,您也不能保证该属性存在。
      诚然,自 PHP 5.3 起,支持后期静态绑定,但这并不能改变这样一个事实,即您永远无法确定某些静态属性只是 碰巧 被称为 $this-&gt;property恰好被分配。如果它被分配了一个对象怎么办?整数还是浮点数?
    2. 您可以像这样访问静态属性:static::$properyself::$property。注意$!当您编写static::$this-&gt;property 时,您期望它的评估结果为self::property_one。您显然错过了$ 标志。
      您至少需要self::${$this-&gt;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();
    

    【讨论】:

    • 实际上,我现在编辑了帖子,但基本代码来自 Laravel 4。通过 static::${$this->property} 它运行良好。
    • @aliA:我正在编辑我的答案,添加代码示例和更多详细信息...添加了第二个完美适合您现在编辑的问题的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2015-12-12
    • 2016-06-26
    • 2017-07-06
    相关资源
    最近更新 更多