【问题标题】:php - calling static function from a extended classphp - 从扩展类调用静态函数
【发布时间】:2016-07-12 18:02:13
【问题描述】:

我无法从扩展类调用静态函数(带有常量)。这是我的代码:

(1st file)
class A
{                        
    function isXSet()
    {
        return X;
    }        
    public static function setX()
    {
        define('X', 1);
    }
}  

(second file)

include('/*first file*/');
class B extends A
{        
    A::setX();        
}

我怎样才能做到这一点?

【问题讨论】:

  • 如果你从某个地方调用它应该可以工作。如果您看一下,A::setX(); 只是“飞来飞去”(它不在方法内部)...
  • @FirstOne - 为什么这是“飞来飞去”?那我怎么称呼它?
  • 我的意思是,看看代码。在那个地方,您定义类属性和方法。你不叫里面的东西..
  • 附带说明,如果你在B 上调用setX(),它会调用A 的方法,因为你扩展了它(没有覆盖)

标签: php static


【解决方案1】:

你的代码在这里

class B extends A
{        
    A::setX();        
}

有点不对劲。您没有将调用放在方法中。

class B extends A
{   
    public static function doSomething() {     
        A::setX();
    }
}

这实际上并没有通过父/子关系做任何事情。事实上,在定义class A 之后,对A::setX() 的调用可以在任何地方发生,因为它是公共的和静态的。此代码同样有效:

class A
{
    function isXSet()
    {
        return X;
    }
    public static function setX()
    {
        define('X', 1);
    }
}

class B { // No extending!
    function isXSet() {
        return A::isXSet();
    }
}

您更可能寻找的是parent

class A
{
    public function isXSet()
    {
        return X;
    }

    protected static function setX()
    {
        define('X', 1);
    }
}

class B extends A
{   
    public static function doSomething() {     
        parent::setX();
        var_dump( parent::isXSet() ); // int(1)
    }
}

这里的一大优点是扩展类可以访问来自parent 类的受保护 方法和属性。这意味着您可以阻止其他人调用A::setX(),除非被调用者是A 的实例或子对象。

【讨论】:

  • 我想我应该让你知道我想做什么 - 我想从 B 类中设置常量,如果设置了常量 X(然后做某事),我想在 A 类中检查 - 怎么能我这样做?
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 2015-05-17
  • 2022-11-04
  • 2015-07-05
  • 2016-08-27
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多