【问题标题】:How to call non-static method from static method of same class?如何从同一类的静态方法调用非静态方法?
【发布时间】:2017-01-13 09:46:32
【问题描述】:

我正在处理PHP 代码。

这是解释我的问题的示例代码:

class Foo {

    public function fun1() {
             echo 'non-static';   
    }
    public static function fun2() {
        echo "static" ;
        //self::fun1();
        //Foo::fun1(); 
    }
}

如何从静态方法调用非静态方法?

注意:这两个功能在整个网站都使用,这是未知的。一世 不能对它们的静态/非静态性质进行任何更改。

【问题讨论】:

  • 我认为非静态方法只能由对象调用。因为它依赖的类和静态方法是独立的。
  • 是的,但是在课堂上,怎么样?我应该在同一个类的函数中创建同一个类的对象吗?
  • 什么问题:-eval.in/715502
  • @Anant 非静态方法 getCommonData() 不应被静态调用。此消息显示为 self:: 和 Foo::

标签: php oop


【解决方案1】:

您必须在静态方法中创建一个新对象才能访问该类中的非静态方法:

class Foo {

    public function fun1()
    {
        return 'non-static';
    }

    public static function fun2()
    {
        return (new self)->fun1();
    }
}

echo Foo::fun2();

结果将是non-static

稍后编辑:鉴于对将变量传递给构造函数的兴趣,我将发布该类的更新版本:

class Foo {

    private $foo;
    private $bar;

    public function __construct($foo, $bar)
    {
        $this->foo = $foo;
        $this->bar = $bar;
    }

    public function fun1()
    {
        return $this->foo . ' - ' . $this->bar;
    }

    public static function fun2($foo, $bar)
    {
        return (new self($foo, $bar))->fun1();
    }
}

echo Foo::fun2('foo', 'bar');

结果将是foo - bar

【讨论】:

  • 如何传递构造函数使用的变量?
  • 我宁愿保持具有静态函数的类尽可能干净。我会把它当作一个静态类。在静态类中,您不会有构造函数吗? PHP 文档中的状态是:将类属性或方法声明为静态使它们无需实例化即可访问。如果 PHP 开发人员取消在静态类中创建非静态函数的可能性,我不会感到惊讶,也许他们还会在未来的版本中在类前面添加静态。只是我的猜测。我对php开发一无所知。
  • @Trond 有一个有效的用例,其中具有静态成员/属性的类应该使用构造函数实例化单例,而静态函数应该调用非静态的。我正在实现 Swoole HTTP 请求事件,为它提供一个作为具有静态成员的类的回调。静态成员做两件事;它通过在类构造函数中进行初始化来创建类的单例对象,第二个这个静态成员所做的是调用非静态方法“run()”来处理请求(通过与 Phalcon 桥接)。因此,没有构造函数和非静态调用的静态类对我不起作用。
【解决方案2】:

主要区别在于您可以为一个类调用静态方法,而不必实例化该类的对象。 所以,在你的静态方法中尝试

Foo $objInst = new Foo();
$objInst->fun1();

但我看不出这在任何情况下都有什么意义。

【讨论】:

  • 谢谢!工作正常。但是我们是否应该在同一个类中实例化同一个类的对象有什么规则吗?
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多