PHP - загрузка / удаление из БД использует статические методы или нет? - PullRequest
1 голос
/ 17 января 2012

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

<?php

class Customer
{
   const DB_TABLE = 'customers';

   public $id = NULL;
   //all other properties here

   function __construct($associative_array = NULL)
   { 
      //fills object properties using values provided by associative array
   }

   static function load($customer_id)
   {
      $obj = new static(); //PHP 5.3 we use static just in case someone in future wants to overide this in an inherited class

      //here we would load data from DB_TABLE and fill the $obj

      return $obj;
   }

   static function delete($customer_id)
   {
      //here we just delete the row in the DB_TABLE based on $customer_id (which is the primary key of the table)
   }

   function save()
   {
      //saves $this properties into a row of DB_TABLE by either updating existing or inserting new one
   }
}

Помимо любого типа комментариев, которые вы делаете в коде (которые всегда приветствуются), главный вопрос здесь таков: "прочитав так много на SO о том, насколько плохи static методы и использование из static в целом, в этом коде вы бы сделали два метода load/delete не статичными? Если да, то почему, не могли бы вы объяснить на небольшом примере. "

Мне кажется странным не делать их static, потому что я думаю, что это странно для создания нового объекта, загруженного из БД, который будет вынужден писать каждый раз:

$obj = new Customer(); //creating empty object
$obj->load(67); //loading customer with id = 67

вместо того, чтобы просто делать

$obj = Customer::load(67); //creates a new customer and loads data form DB

1 Ответ

2 голосов
/ 17 января 2012

Все зависит от того, как вы хотите, чтобы ваш код был структурой. Статические функции IMO неплохие, если вы используете их правильно.

Например, все функции моих моделей похожи и имеют следующую структуру:

class models_car {
    public static function getCar($id);
    public static function getCars();
    public static function getCarsByDriver(models_driver $driver);
    public function save();
    public function delete();
    public function isNew();
    public function getProperty1();
    public function getProperty2();
    public function getProperty3();
    public function setProperty1($value);
    public function setProperty2($value);
    public function setProperty3($value);
}

Таким образом, здесь вы можете использовать модель как представление конкретной записи, и если вы вызываете delete или save, она вызывается в контексте самого объекта. Если вы вызываете getCar, getCars или getCarsByDriver, они статические, потому что они не относятся к конкретному объекту, они являются загрузчиками, которые возвращают заполненный объект.

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

...