14

好的,我有这个代码,我正在学习

 class scope{

    function printme(){
        return "hello";
    }

    public static function printme(){
        return "hello"; 
    }

 }

$s = new scope();
echo $s->printme(); //non-static call
echo "<br>";
echo scope::printme(); //static call

现在,这不是我项目的真正代码,但这些是我想做的事情

  1. 我想创建一个包含静态和非静态函数的类。
  2. 我希望一个函数在静态和非静态调用中都可用。

由于非静态函数有很多操作,我还需要将它作为静态函数调用,这样我就不需要实例化类。这可能吗?或者我真的需要将函数重写为另一个函数或类?

注意:如果我已经在做一些糟糕的编程,请告诉我。

4

3 回答 3

35

这是规则:

静态方法既可以用于静态方法,也可以用于非静态方法。

非静态方法只能在非静态方法中使用。

于 2012-06-06T03:22:43.347 回答
6

如果你的类的实例很少需要,你可以让静态方法创建一个实例,调用非静态方法并返回值。

class Scope {
    public function mynonstatic() {
    }

    public static function mystatic() {
        $s = new Scope();
        return $s->mynonstatic();
    }
}

请记住,静态方法实际上只是一个范围缩小的全局函数。它们很有用,但不应在没有充分理由的情况下创建它们。

于 2012-06-06T03:27:25.367 回答
2

由于非静态函数有很多操作,我还需要将它作为静态函数调用,这样我就不需要实例化类。这可能吗?或者我真的需要将函数重写为另一个函数或类?

如果你需要它是静态的,那就让它成为静态的。如果您不需要它,请保持原样。可以从非静态函数内部调用静态函数。

class Foo
{
    public function bar()
    {
        Foo::zex();

        // or self::zex() or even $this->zex();
    }

    public static function zex()
    {
    }
}


$foo    = new Foo;
$foo->bar();

蚂蚁反过来。

class Foo
{
    public function bar()
    {

    }

    public static function zex()
    {
        $foo    = new Foo;
        $foo->bar();
    }
}

什么时候应该做或应该做是另一个问题。后者最常见的用法可能是 Singleton 模式。

于 2012-06-06T03:26:19.320 回答