2014-09-09 3 views
2

Я знаю, что перегрузка в PHP недоступна, и есть временное решение с func_get_args. Но мой вопрос: что я могу сделать, если хочу сделать статическую и нестационарную версию того же метода? Например, у меня есть класс Profiles_Model. Иногда может понадобиться только, чтобы получить все профили, но ничего больше, так что я не хочу, чтобы создать экземпляр объекта, вызывая статический метод будет достаточно, как:Перегрузка методов PHP

Profiles_Model :: getProfiles();

Но иногда может иметь экземпляра объекта из класса, и я использую другие методы, и я хотел бы, если не только класс, но сам объект был один и тот же метод, как:

$pmodel=new Profiles_Model(); 
$pmodel->getProfiles(); 

ли есть ли какие-то решения? Это то, что я хотел бы:

class Profiles_Model extends Model{ 
    . 
    . 
    . 
    public function getProfiles(){ 
     // do some stuff 
    } 

    public static function getProfiles(){ 
     // do some stuff with the same results 
    } 

} 
+4

Если результат будет действительно же, почему вы не вызывать статический метод с «Я» или «статический» ? –

+1

Я бы избегал использования методов с тем же именем, которые содержат другое поведение. Может быть, смущает и, вероятно, нарушает единую ответственность. Я уверен, что экземпляр Profiles_Model, имеющий метод getProfiles(), вернет список содержащихся в нем элементов. вызов Profiles_Model :: getProfiles() предполагает, что класс знает что-то о том, как получить профили и, следовательно, ведет себя по-другому. – Hammerstein

+0

Если они производят тот же результат - зачем их дублировать? Кроме того, я рекомендую вам использовать методы из объектов (нестатические), так как они в два раза быстрее (как я помню). – Kleskowy

ответ

1

Статические методы могут быть вызваны в объект таким образом, таким образом имея статический метод

Profiles_Model::getProfiles(); 

Также будет доступен

$pmodel=new Profiles_Model(); 
$pmodel->getProfiles(); 

но в методе вы не можете получить доступ к свойствам объекта, а только статические поля и статические методы.

Но то, что вы можете обмануть здесь:

class a 
{ 

    public static function __callStatic($name, $arguments) 
    { 
     if ($name === 'b') 
     { 
      echo "a::b() called"; 

      return true; 
     } 

     throw new BadMethodCallException(); 
    } 


    public function __call($name, $arguments) 
    { 
     if ($name === 'b') 
     { 
      echo "b() called in object context"; 

      return true; 
     } 

     throw new BadMethodCallException(); 
    } 

} 

пример:

$a = new a(); 
$a->b(); // b() called in object context 

a::b(); // a::b() called