PHP类:通过构造函数分配静态属性

时间:2011-06-24 22:06:50

标签: php class

类的简化示例:

class Table extends TableAbstract{
    protected static $tablename;

    function __construct($str){
       $this->tablename = "table_" . $str;
       $this->insert();    // abstract function
    }

}

当我过去使用这样的类时,我在编写类时直接指定了$ tablename。但是这次我希望它由构造函数决定。但是当我调用函数引用$ tablename时,变量似乎是空的,当我回显SQL时。

我做错了什么,或者有人建议一种方法来实现我想要的东西?

感谢您的任何意见/答案..

5 个答案:

答案 0 :(得分:6)

由于该属性为static,请使用Table::$tablenameself::$tablename访问该属性,以隐式引用当前类。

答案 1 :(得分:2)

访问静态属性时,您需要使用self::$varName而不是$this->varName。静态方法也是如此。

编辑: 为了突出抽象和静态/非静态属性之间的一些差异,我做了一个小例子。

<?php
abstract class A{
    public abstract function setValue($someValue);

    public function test(){
        echo '<pre>';
        var_dump($this->childProperty);
        var_dump(B::$childStatic);
        echo '</pre>';
    }
}

class B extends A{
    protected $childProperty = 'property';
    protected static $childStatic = 'static';

    public function setValue($someValue){
        $this->childProperty = $someValue;
        self::$childStatic = $someValue;
    }
}

//new instance of B
$X = new B();
//another new instance of B
$Y = new B();

//output the values
$X->test();
$Y->test();

//change the static and standard property in $X
$X->setValue("some new value");

//output the values again.
$X->test();
$Y->test();
?>

输出:

string(8) "property"
string(6) "static"

string(8) "property"
string(6) "static"

string(14) "some new value"
string(14) "some new value"

string(8) "property"
string(14) "some new value"

在$ X上调用setValue之后,您可以看到静态属性的值在两个实例中都发生了变化,而非静态属性仅在该一个实例中发生了变化。

另外,我刚刚学到了一些东西。在尝试访问静态子属性的抽象类的方法中,您必须指定子类名来访问该属性,self::不起作用并抛出错误。

答案 2 :(得分:2)

如果您想查看 php static 这样的内容,您会发现:

来自PHP Manual

  

静态关键字

     

无法访问静态属性   使用箭头通过对象   运营商 - &gt;。

答案 3 :(得分:1)

static属性在类上设置,而不是在实例上设置。摆脱static使$tablename成为正常的实例属性,它应该按预期工作。

答案 4 :(得分:1)

静态成员不与实例绑定,但它与类更相关,因此您无法通过$this真正引用静态成员。您应该使用self::$staticMemberName从类实例中访问静态成员。