PHP: Как не нужно наследовать

Древо жизни все зеленее и зеленее, а ООП конечно крут, но! стоит любую теорию со временем применять на практике, и кроме примеров как нужно я буду выкладывать и найденные у умненьких, но иногда очень спешащих людей, примеры как не надо и что я потом рефакторю нещадно.
как писать код

Как не надо

<?php
namespace demo\controllers;
class AdminsController extends UsersController
{
	public function index()
	{
		return $this->_index(true);
	}
 
	public function edit($id_user)
	{
		return $this->_edit(true, $id_user);
	}
 
	public function save()
	{
		return $this->_save(true);
	}
...
}

И собственно реализующий это класс (оцените триггер $is_admins и количество его вхождений!!!!)

<?php
namespace demo\controllers;
 
class UsersController extends SaverController
{
	public function index()
	{
		return $this->_index(false);
	}
 
	public function edit($user_id)
	{
		return $this->_edit(false, $user_id);
	}
 
	public function save()
	{
		$this->_save(false);
	}
 
	protected function _index($is_admins)
	{
		...
		echo $is_admins
			? ContentAdmins::getList($fields, null,null,null,null,true)
			: ContentUsers::getList($fields, null,null,null,null,true);
		...
		if ($is_admins) {
			Content::updateMultiByID($users_to_update, ContentAdmins::TABLE);
		} else {
			Content::updateMultiByID($users_to_update, ContentUsers::TABLE);
		}
		...
		$values = array_values($is_admins
			? ContentAdmins::getList(null, $conditions, $limit, $order_field . $order_direction, $offset)
			: ContentUsers::getList(null, $conditions, $limit, $order_field . $order_direction, $offset)
		);
		$count['total']  = array_values($is_admins 
						? ContentAdmins::getCount($conditions)           : ContentUsers::getCount($conditions));
		$count['job_id'] = array_values($is_admins 
						? ContentAdmins::getCount($conditions, 'job_id') : ContentUsers::getCount($conditions, 'job_id'));
		$count['type']   = array_values($is_admins 
						? ContentAdmins::getCount($conditions, 'type')   : ContentUsers::getCount($conditions, 'type'));
		return array('values' => $values, 'count' => $count);
	}
 
	protected function _edit($is_admins, $user_id)
	{
		...
		$result['user'] = $is_admins ? ContentAdmin::getUser($user_id) : ContentUser::getUser($user_id);
		...
	}
 
	protected function _save($is_admins)
	{
		... 
                if (DB::update($is_admins ? ContentAdmins::TABLE : ContentUsers::TABLE, $data['id'], $to_update)) die('OK');
                ... 
	}
}

Как надо

<?php
namespace demo\controllers;
class AdminsController extends UsersController
{
	const DB_TABLE  = ContentAdmin::TABLE_USERS;
	const DB_MODEL  = '\demo\libs\models\ContentAdmin';
	const DB_MODELS = '\demo\libs\models\ContentAdmins';
	const GET_SITES = false;
...
}

<?php
namespace demo\controllers;
 
class UsersController extends SaverController
{
	const DB_TABLE  = ContentUser::TABLE_USERS;
	const DB_MODEL  = '\medpoisk\libs\models\ContentUser';
	const DB_MODELS = '\medpoisk\libs\models\ContentUsers';
	const GET_SITES = true;
 
	protected function index()
	{
		$class_models = static::DB_MODELS;
		...
		echo $class_models::getList($fields, null,null,null,null,true)
		...
		Content::updateMultiByID($users_to_update, static::DB_TABLE;	
		...
		$values = array_values($class_models::getList(null, $conditions, $limit, $order_field . $order_direction, $offset))
		);
		$count['total']  = array_values($class_models::getCount($conditions));
		$count['job_id'] = array_values($class_models::getCount($conditions, 'job_id'));
		$count['type']   = array_values($class_models::getCount($conditions, 'type'));
		return array('values' => $values, 'count' => $count);
	}
 
	protected function _edit($is_admins, $user_id)
	{
		...
		$result['user'] = $class_model::getUser($user_id);
		...
	}
 
	protected function _save($is_admins)
	{
		... 
                if (DB::update(static::DB_TABLE, $data['id'], $to_update)) die('OK');
                ... 
	}
}

Что еще можно

Модель могла бы быть создана в контроллере на инициализации (не статические классы), и потом нам уже вообще все равно над какой моделью мы выполняем действия пока они наследуют один интерфейс.

Оставить комментарий

XHTML: Вы можете использовать такие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">