2013-03-18 126 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