类的简化示例:
class Table extends TableAbstract{
protected static $tablename;
function __construct($str){
$this->tablename = "table_" . $str;
$this->insert(); // abstract function
}
}
当我过去使用这样的类时,我在编写类时直接指定了$ tablename。但是这次我希望它由构造函数决定。但是当我调用函数引用$ tablename时,变量似乎是空的,当我回显SQL时。
我做错了什么,或者有人建议一种方法来实现我想要的东西?
感谢您的任何意见/答案..
答案 0 :(得分:6)
由于该属性为static
,请使用Table::$tablename
或self::$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)
答案 3 :(得分:1)
static
属性在类上设置,而不是在实例上设置。摆脱static
使$tablename
成为正常的实例属性,它应该按预期工作。
答案 4 :(得分:1)
静态成员不与实例绑定,但它与类更相关,因此您无法通过$this
真正引用静态成员。您应该使用self::$staticMemberName
从类实例中访问静态成员。