结合静态类和非静态类

时间:2013-03-18 06:40:24

标签: php oop class

例如,考虑具有一些实用方法('foo','bar')的类X,它们对X的某些属性执行某些操作。这些方法对其他外部变量也很有用。 有些人可能会实现XstaticX类,如下所示:class Foo

class StaticX
{

    public static function foo($p)
    {
        return $p * $p;
    }
}

class X
{
    private $p=4;

    public function foo()
    {
        return StaticX::foo($this->p);
    }
}

$x= new x;
echo $x->foo();

echo StaticX::foo(3);

但这种方法存在一些可维护性问题。 有没有更好的解决方案?

3 个答案:

答案 0 :(得分:2)

class X
{
    private $p;

    public function foo()
    {
        return self::doFoo($this->p);
    }

    public static function doFoo($p)
    {
        return $p * $p;
    }
}

答案 1 :(得分:0)

我喜欢愚蠢的答案,但是这个怎么样?

class X
{
    private static $p;

    public static function foo($p=null)
    {
        if ( is_null( $p ) ) {
            $p = self::$p;
        }
        return $p * $p;
    }
}

答案 2 :(得分:0)

从PHP 5.4开始,您可以使用traits。见http://www.php.net/manual/en/language.oop5.traits.php

trait fooBehavior {
    function getFoo() { return self::foo($this->p); }
    static function foo($p) { return $p * $p; }
}

class X {
    use fooBehavior;

    private $p;

    public function __construct($p) { $this->p = $p; }
}

$x = new X(2);
echo $x->getFoo(); // echoes 4
echo $x::foo(2); // echoes 4