2013-03-18 183 views
1

例如,考虑类X,它有一些实用方法('foo','bar')在X的某些属性上执行一些操作。这些方法对其他外部变量也很有用。 有些可以实现XstaticX类如下:类FooCombinig静态类和非静态类

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

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

+0

请解释您正在谈论的问题。 – BetaRide 2013-03-18 06:48:56

+0

@BetaRide如果你提供'X :: foo',你也可以改变'StaticX :: foo' – PHPst 2013-03-18 06:57:38

+0

如果你使用php 5.4+你可以使用'trait'。请参阅http://php.net/manual/en/language.oop5.traits.php – Bart 2013-03-18 08:37:16

回答

2
class X 
{ 
    private $p; 

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

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

谢谢,这在某种程度上更好,但您必须使用两个名称来完成相同的任务并保留两个函数。 – PHPst 2013-03-18 06:59:10

+0

您只维护一个函数(静态函数'doFoo()',因为成员函数'foo()'只是静态函数的一个包装,您不再需要对这两个函数进行相同的更改 – FoolishSeth 2013-03-18 13:29:53

0

我喜欢愚蠢的答案,但这又如何呢?

class X 
{ 
    private static $p; 

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

使$ p static – PHPst 2013-03-18 07:41:08

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 
+0

我调整了我对你的用例的回答,所以你明白了,它适用于:-) – Bart 2013-03-18 08:55:50

+0

插入你想要的行为。只是讽刺他们'特质'。 – Bart 2013-03-18 09:16:30