组合一个静态类和一个非静态类


Combinig a static class and a non-static one

例如,考虑类X有一些实用方法('foo','bar')对X的某些属性进行一些操作。这些方法也适用于其他外部变量。有些可能实现XstaticX类如下:

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);

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

class X
{
    private $p;
    public function foo()
    {
        return self::doFoo($this->p);
    }
    public static function doFoo($p)
    {
        return $p * $p;
    }
}

我喜欢这个答案,但是这个呢?

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

从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