2013-03-18 2 views
1

Например, рассмотрим класс X, который имеет некоторые методы утилиты ('foo', 'bar'), которые выполняют некоторую операцию над некоторым свойством X. Этот метод также полезен для других внешних переменных. Некоторые могут реализовать X и staticX классов, как показано ниже: класс 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); 

Но этот подход имеет некоторые проблемы ремонтопригодность. Есть ли лучшее решение?

+0

Пожалуйста, объясните, о чем вы говорите. – BetaRide

+0

@BetaRide Если вы chane 'X :: foo', вы также меняете' StaticX :: foo' – PHPst

+0

, если вы используете php 5.4+, вы можете использовать 'trait'. См. Http://php.net/manual/en/language.oop5.traits.php – Bart

ответ

2
class X 
{ 
    private $p; 

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

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

Спасибо, это как-то лучше, но вы должны использовать два имени для одной задачи и поддерживать две функции. – PHPst

+0

Вы поддерживаете только одну функцию (статическая функция 'doFoo()', потому что функция-член 'foo()' является просто оболочкой статической функции. Вам больше не нужно делать одинаковые изменения для обеих функций. – FoolishSeth

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

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

+0

Введено поведение, которое вы хотели. Просто оставьте их в «признаке». – Bart

Смежные вопросы