2015-05-22 10 views
0

Хорошо, мне удалось закончить это.Слишком много параметров?

Контроллер:

$addProperty=Property::addProperty($title,$description,$location, 
       $agent,$owner,$lat,$long,$position,$photoHolder, 
       $stars,$negatives,$adverts,$dropLink,$photosSite); 

Модель:

public static function addProperty($title,$description,$location,$agent, 
      $owner,$lat,$long,$position, 
      $photoHolder,$stars,$negatives, 
      $adverts,$dropLink,$photosSite) 

Проблема заключается в том, что не только у меня есть слишком много параметров, но мне нужно пройти около 10 больше.

Любые советы?

+3

передать массив или объект. – AbraCadaver

+0

Хорошо, звучит как самый подходящий способ! – Makis

+4

Кроме того, я не знаю, использование/дизайн, но 'addProperty()' похоже, что он должен добавить ONE: 'function addProperty ($ property, $ value)' и, возможно, 'function addProperties ($ propArray)' или что-то для нескольких , – AbraCadaver

ответ

2

Существует несколько способов сделать это. Мой предпочтительный способ, хотя при работе с моделями - иметь метод набора для каждого атрибута. Таким образом вам не нужно передавать все сразу (очень полезно, когда приложение развивается, и материал добавляется/удаляется).

Таким образом, в модели, я обычно что-то вроде этого:

class Property { 

    private $title; 
    private $description; 
    private $location; 

    /** 
    * Creates an instance of property via a static method. 
    * 
    */ 
    public static factory() 
    { 
     return new Property(); 
    } 

    public function setTitle($title) 
    { 
     $this->title = $title; 
     return $this; 
    } 

    public function setDescription($description) 
    { 
     $this->description = $description; 
     return $this; 
    } 

    public function setLocation($location) 
    { 
     $this->location = $location; 
     return $this; 
    } 

    // because the attributes in this instance are private I would also need getters 

    public function getTitle() 
    { 
     return $title; 
    } 

    public function getDescription() 
    { 
     return $description; 
    } 

    public function getLocation() 
    { 
     return $location; 
    } 
} 

Затем вы можете также добавить в методе save() или то, что вы хотите, чтобы это сделать.

ОК, поэтому я добавил новый статический метод, называемый factory, который позволяет создавать экземпляр без необходимости его назначения переменной. В дополнение к этому я добавил return $this; ко всем методам, которые не возвращают атрибут.

Что это фактически означает, теперь вы можете это сделать:

// create a new property 
Property::factory() 
    ->setTitle($title) 
    ->setDescription($description) 
    ->setLocation($location) 
    ->save(); // if you had that function 

Красота этого является то, что если вы сделали должны иметь перерыв в нем, то следующий будет также работать.

// create a new property 
$property = Property::factory() 
    ->setTitle($title) 
    ->setDescription($description); // this is returning the property instance `return $this` 

// do some processing to get the $location value 

// continue creating the new property 
$property 
    ->setLocation($location) 
    ->save(); // if you had that function 
+0

Хороший ответ! Я использую «статическую функцию» для вызова модели без создания экземпляра. Я новичок в «объектно-ориентированном php», поэтому не могли бы вы объяснить, почему лучше делать это без статических функций? – Makis

+0

Я обновил свой ответ, чтобы отразить то, что у меня было бы в приложении. Статические функции хороши для выполнения одного действия или наличия вспомогательных функций. Но когда вы работаете с моделями, вы обычно хотите повесить их на некоторое время, чтобы вы могли выполнять различные действия над ними. В вашем случае вы хотели добавить больше атрибутов, а это означало, что вам пришлось перекачивать больше переменных в статическую функцию, тем самым делая ее раздутой. – diggersworld

+0

Большое спасибо за ваш ответ! Я могу понять все, кроме использования функций get(). По какой причине? – Makis

2

лучший способ, чтобы передать параметр как массив:

$params=array(
'title'=>'title', 
'other_parameter'=>'value', 
); 

$addProperty=Property::addProperty($params); 
Смежные вопросы