PHP中的静态和非静态调用

时间:2012-06-06 03:18:14

标签: php oop

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

 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. 我希望在静态和非静态调用中都可以使用函数。
  3. 由于非静态函数对它有很多操作,我还需要将其称为静态函数,这样我就不需要实例化该类了。这可能吗?或者我真的需要将函数重写为另一个函数或类?

    注意:告诉我我是否已经做了一些糟糕的编程。

3 个答案:

答案 0 :(得分:35)

以下是规则:

静态方法可以用于静态方法和非静态方法。

非静态方法只能用于非静态方法。

答案 1 :(得分:6)

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

class Scope {
    public function mynonstatic() {
    }

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

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

答案 2 :(得分: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模式。