1

我试图通过父类访问子类中的成员变量而无需实例化。

这是我的尝试之一,但B::getStatic()Access to undeclared static property.

是否有另一种解决方案,可能没有静态?

class A {

    static public function getStatic() {

        return self::$myStatic;

    }

}

class B extends A {

    public static $myStatic = 5;

}

class C extends A {

    public static $myStatic = 6;

}

var_dump(B::$myStatic);
var_dump(B::getStatic());

var_dump(C::$myStatic);
var_dump(C::getStatic());
4

8 回答 8

2

您遇到的概念称为“后期静态绑定”。在 PHP 5.3.0 之前,没有对此的支持。

如果您运行的是 5.3.0 或更高版本,请更新 getStatic() 方法:

静态公共函数 getStatic() {

return static::$myStatic;

}

于 2009-02-04T06:18:36.197 回答
1

其他人是对的,因为变量在编译时不存在,所以您的代码无法完成。

做这样的事情的方法通常是使用抽象类(在 PHP5 及更高版本中可用,看起来像)。

A 类是抽象类,并且有一个 getStatic() 函数。类 B 和 C 将扩展 A 并具有 getStatic() 函数的定义。这样,当您调用 getStatic() 时,您将获得子类定义的值,因为 A 中没有定义。

这种方法的警告是你不能实例化 A 因为它是抽象的。您总是必须制作 B 或 C(或其子类)。

您还可以在 A 中创建一个 setter,并让子类使用它来设置值(而不是 '='s)。这将让您实例化 A 并且它可以在需要时设置值。您也许可以将 setter 设为私有,因此不能直接调用它,我不知道子类是否可以在 PHP 中使用私有函数。

于 2009-02-04T00:49:02.290 回答
0

函数和变量的声明不匹配。

您需要将函数的声明移至 B

或者

将变量的声明移至 A。

于 2009-02-03T23:32:36.360 回答
0

B 类从 A 类继承属性,而不是相反。

你为什么不在你B::$myStatic的例子中使用like?

于 2009-02-03T23:34:26.137 回答
0

您必须将 myStatic 移入 A。您在 A 中的方法 getStatic 无法访问 A 中不存在的变量。

于 2009-02-03T23:38:42.353 回答
0

PHP 手册

对当前类的静态引用,如self::__CLASS__使用函数所属的类解析,如定义它的位置:

因此,由于该方法是在 A 中定义的,因此当您调用getStatic()B尝试C返回a::$myStatic时,该方法不存在。即使它确实存在,您也只能取回该值,而不是子类中的任何覆盖值。

一种解决方案是后期静态绑定,但这仅在尚未发布的 PHP 5.3 中可用。

于 2009-02-04T00:22:59.487 回答
-1

$myStatic必须在 A 类中声明为静态:参见此处

于 2009-02-03T23:32:23.707 回答
-1
class A {
    public static $myStatic = 5;
}    
class B extends A {
    public static $myStatic = 3;
}
class C extends A {
    public static $myStatic = 1;
}

然后只需使用 B::$myStatic ...

于 2009-02-03T23:34:47.057 回答