PHP ООП. Объект Users. Разжуйте плиз как надо это делать...

miftahovn

Новичок
PHP ООП. Объект Users. Разжуйте плиз как надо это делать...

Давно мечтаю перейти от процедурного программирования к ООП.
Теорию знаю примеры на C++ писал, и решал, но как это приложить к реальным вещам не понимаю...

Пример:
Есть таблица в MySql Users, есть огромное желание создать одноименный объект,
с следующими целями:

Пожелания
а)чтобы создание и удаление записей в таблице всегда происходило через метод createUser объекта,
с учетом проверки множества связей, целостности и.т.д.

б) чтобы обеспечить кэширование, если уже выбирали соответствующую запись Users второй раз в БД не лезем

в) чтобы в конце - концов дописать эту штуку, и больше не знать как там это внутри работает -)

--------------------------------------------------------------------------------------------------------------------
1. допустим создаю объект
$users = new Users();
$users -> name = "Tron"
$users -> city = 'Moscow';
$users -> about = 'Taram Taram';
$users -> insertRecord();

а) можно ли записать это как-нибудь покороче без присваивания всего и вся...

б) как эту штуку заставить проверять тип, длину, правильность присваиваемых значений полей,
или это можно сделать только в момент insert ?

в) на случай неуспеха вставки данных, нам нужно вернуть все это в поля формы, опять долго и нудно все оттуда доставать ?

---------------------------------------------------------------------------------------------------------------------
2. у нас на одной странице есть множество user`ов, т.е. пример было
while {
my54[userName] = getUserName($uid);
my54[userAbout] = getUserAbout($uid);
}

теперь это будет выглядеть
$users = new Users();
$users -> init(54);
my54[userName] = $user->name;

ааа... помогите, тогда на кой фиг оно надо ?

как сделать так чтобы
а) получение данных был минимально коротким
б) все пользователи которые уже выдергивались были кэшированы

вижу 2 решения кэширования:
а) типа всякие объекты $users[54], $users[727]
б) один объект $users -> getUserName($uid);


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

miftahovn

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

syfisher

TDD infected!!
miftahovn
Такие книги с первого раза понять нельзя. Читай еще. А Фаулера правильно посоветовали, там как раз нужные тебе идеи есть.

Насчет твоей задачи - копай паттерн ActiveRecord и UnitOfWork.

P.S. Я конечно могу посоветовать посмотреть Limb ;) http://wiki.limb-project.com/doku.php?id=limb:ru:3_x:usage:active_record
 

AmdY

Пью пиво
Команда форума
miftahovn
Чёрт, только хотел послать читать про паттерны, если считаешь,
что ето ерунда, то читай книгу "Как стать строителем за 24 часа".
 

miftahovn

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

Расписал все максимально корректно, и подробно, а Вы меня вместо помощи, посылаете во все стороны.

Я же не прошу, чтобы за меня написали, просто подскажите, в чем я заблуждаюсь, и куда копать, по возможности к подобному примеру, а не в книгу на 700 листов.

PS: за Limb спасибо, в принципе очень похожая вещь.
 

AmdY

Пью пиво
Команда форума
Автор оригинала: miftahovn
Спасибо ребят, очень вежливые, и помогающие люди,
особенно AmdY работающий строителем ...
Пожалуйсто, коллега.
Расписал ты и впрямь неплохо, но затем начал гадить на паттерны ("прочитал много ерунды ввиде паттернов проектирования"), хотя сам именно об них и спрашивал.
 

riff

Новичок
А в чём ты видишь превосходство создания класса users в сравнении с функциями? И в том и в другом случае тебе придётся написать одинаковое их кол-во, единственное, возможно лишь разница будет в параметрах...
 

miftahovn

Новичок
превосходство вижу, что смогу абстрагироваться, от того какие именно проверки свойств происходят в классе, и просто использовать объект
 

riff

Новичок
Но в любом случае тебе придётся вызывать функцию типа "$users->add_user()", чтобы юзер добавился в какой-то массив... а это тоже самое что и add_user($name, $city, ...) в этой же функцие и делай проверку.
 

AmdY

Пью пиво
Команда форума
riff, ты не в ту сторону начал копать, чем тебе класс не нравится?
 

riff

Новичок
Автор оригинала: AmdY
riff, ты не в ту сторону начал копать, чем тебе класс не нравится?
Тем, IMHO, что они одинаковые получаются
PHP:
class user
{
  var $name;
  var $city;

  function user($name, $city)
  {
    $this->name = $name;
    $this->city = $city;
  }
}

class users
{
  var $users;

  function add_user(&$user)
  {
    $users[] = $user;
  }

  function get_user_by_name($user_name)
  {
    for ...
      if ($user[$i]->name === $user_name)
        return $users[$i];
  }
}

$users =& new users();

$user =& new user('aaa', 'bbb');
$users->add_user($user);
почти тоже будет и в процедурном стиле
PHP:
function new_user($name, $city)
{
  //какую-то проверку можно сделать
  //if error return false;
  $user = array();
  $user['name'] = $name;
  $user['city'] = $city;
  return $user;
}

function add_user(&$user, &$users)
{
    $users[] = $user;
}

function get_user_by_name($user_name, &$users)
{
  for ...
    if ($users[$i]['name'] === $user_name)
      return $users[$i];
}

$users = array();

$user = new_user('aaa', 'bbb');
if ($user !== false)
  add_user($user, $users);
На ошибки не смотрите, т.к. писал здесь, но смысл думаю понятен.
 

Larian

Новичок
riff

Все это уже было и не раз. Если тебе надо будет, при доставаниии каких-то данных из объекта, добавить какие то преобразования - и это нужно во многих частях системы, то с функциями придется лазить везде и добавлять один и тот же функционал.
 

С.

Продвинутый новичок
miftahovn, поверь, разница только в синтаксисе. Абстрагироваться можно и при процедурном программировании. А использование ООП синтаксиса не ведет автоматом к абстрактному мышлению. В большинстве случаев ООП синтаксис действительно только загромождает код и замедляет исполнение программы. Просто дань моде. Написать absd::efgh() - кульно и неймспейсно, а absd_efgh() - не гламурно!
 

riff

Новичок
Автор оригинала: Larian
Все это уже было и не раз. Если тебе надо будет, при доставаниии каких-то данных из объекта, добавить какие то преобразования [...]
Если можно, на примере покажи, какие преобразования ты имеешь ввиду "при доставании данных из объекта".
 

AmdY

Пью пиво
Команда форума
Ну, а такой пример
PHP:
class user { 
  var $name; 
  var $city; 

  function user($name, $city) 
  { 
    $this->name = $name; 
    $this->city = $city; 
  } 
}
class user2 extends user {
  var address;
  
  function setAddress($address) {
    $this->address = $address;
  }
}
 

Larian

Новичок
Автор оригинала: riff
Если можно, на примере покажи, какие преобразования ты имеешь ввиду \"при доставании данных из объекта\".
У меня валом таких обьектов у которых некоторые поля не могут быть пустыми. и ни в коем случае не должны использоваться пустыми. Без ооп мне пришлось бы писать доп функцию через которую идет вызов с проверкой. И везде где используюется нужные данные, нужно вставить эту функцию.
При ооп я просто создаю геттер через __get и на этом работа закончена.

Надо реально, чтобы была такая задача, что пришлось бы бегать везде, выясняя, где добавить проверки, чтобы оценить. Я после такой мороки уже заранее сеттер и геттер создаю. ибо знаю что 70% что понадобятся.
 

Larian

Новичок
riff

Покажи мне, как к функциям прикрутить интерфейсы. И безумно хотелось бы увидеть полиморфизм. :)
 
Сверху