PHP армагедон

AmdY

Пью пиво
Команда форума
Vladson, Adelf +1
а можно ещё не закручивать, а забивать, получится за то же время забить 2-3, но затем всё это развалится.
 

WMix

герр M:)ller
Партнер клуба
ваяс
Но в программинге я далеко не мастер. Я новичок ещё, я многово не знаю. Некоторые мне кажутся вообще бессмысленными, например полиморфизм, а все дело в том что я не понимаю его сути, но преимущество его огромно.
мне кажется что ты придаешь слову слишком большой смысл.... в этом слове сокрыто всеголишь слово interface..

PHP:
//есть автомобиль
interface Car { function go(); }

// конкретная машина
class Porsche implements Car { function go() {
 // прикрутили
} }

// учимся ездить на машине
function drive(Car $car) { $car->go(); }


$porsche = new Porsche();
// ПОЛИМОРИЗМ
drive($porsche);
 

Absinthe

жожо
phpBB, vBulletin, Joomla, Drupal, WordPress, MODx, eCommerce решения и т.д. - это и есть PHP, сегодня это почему-то "говнокод".
это действительно говнокод.
А про пхпбб и джумлы - ну так именно поэтому сложилось устойчивое мнение "php=говнокод", кого ты этим удивить собрался?
Мне кажется, что достаточно неплохо. Примеры кода:

PHP:
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_newsfeeds
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * This models supports retrieving lists of newsfeed categories.
 *
 * @package     Joomla.Site
 * @subpackage  com_newsfeeds
 * @since       1.6
 */
class NewsfeedsModelCategories extends JModelList
{
	/**
	 * Model context string.
	 *
	 * @var		string
	 */
	public $_context = 'com_newsfeeds.categories';

	/**
	 * The category context (allows other extensions to derived from this model).
	 *
	 * @var		string
	 */
	protected $_extension = 'com_newsfeeds';

	private $_parent = null;

	private $_items = null;

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @since   1.6
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();
		$this->setState('filter.extension', $this->_extension);

		// Get the parent id if defined.
		$parentId = $app->input->getInt('id');
		$this->setState('filter.parentId', $parentId);

		$params = $app->getParams();
		$this->setState('params', $params);

		$this->setState('filter.published',	1);
		$this->setState('filter.access',	true);
	}

	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * This is necessary because the model is used by the component and
	 * different modules that might need different sets of data or different
	 * ordering requirements.
	 *
	 * @param   string  $id	A prefix for the store id.
	 *
	 * @return  string  A store id.
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id	.= ':'.$this->getState('filter.extension');
		$id	.= ':'.$this->getState('filter.published');
		$id	.= ':'.$this->getState('filter.access');
		$id	.= ':'.$this->getState('filter.parentId');

		return parent::getStoreId($id);
	}

	/**
	 * redefine the function an add some properties to make the styling more easy
	 *
	 * @return mixed An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		if (!count($this->_items))
		{
			$app = JFactory::getApplication();
			$menu = $app->getMenu();
			$active = $menu->getActive();
			$params = new JRegistry;
			if ($active)
			{
				$params->loadString($active->params);
			}
			$options = array();
			$options['countItems'] = $params->get('show_cat_items_cat', 1) || !$params->get('show_empty_categories_cat', 0);
			$categories = JCategories::getInstance('Newsfeeds', $options);
			$this->_parent = $categories->get($this->getState('filter.parentId', 'root'));
			if (is_object($this->_parent))
			{
				$this->_items = $this->_parent->getChildren();
			} else {
				$this->_items = false;
			}
		}

		return $this->_items;
	}

	public function getParent()
	{
		if (!is_object($this->_parent))
		{
			$this->getItems();
		}
		return $this->_parent;
	}
}
PHP:
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_newsfeeds
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Newsfeeds Component Controller
 *
 * @package     Joomla.Site
 * @subpackage  com_newsfeeds
 * @since       1.5
 */
class NewsfeedsController extends JControllerLegacy
{
	/**
	 * Method to show a newsfeeds view
	 *
	 * @param   boolean			If true, the view output will be cached
	 * @param   array  An array of safe url parameters and their variable types, for valid values see {@link JFilterInput::clean()}.
	 *
	 * @return  JController		This object to support chaining.
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$cachable = true;

		// Set the default view name and format from the Request.
		$vName = $this->input->get('view', 'categories');
		$this->input->set('view', $vName);

		$user = JFactory::getUser();

		if ($user->get('id') || ($this->input->getMethod() == 'POST' && $vName = 'category' ))
		{
			$cachable = false;
		}

		$safeurlparams = array('id' => 'INT', 'limit' => 'UINT', 'limitstart' => 'UINT', 'filter_order' => 'CMD', 'filter_order_Dir' => 'CMD', 'lang' => 'CMD');

		parent::display($cachable, $safeurlparams);
	}
}
 

fixxxer

К.О.
Партнер клуба
PHP:
            if (is_object($this->_parent))
            {
                $this->_items = $this->_parent->getChildren();
            } else {
                $this->_items = false;
            }
фи!

если серьезно, да, прогресс виден, но кажется, именно такому прогрессу не рад тредстартер
 

keltanas

marty cats
fixxxer
Да, пустая коллекция - это false ))
А что, массив или объект - это не булев тип?
 

fixxxer

К.О.
Партнер клуба
Массив будет false если пустой, иначе true, объект всегда true.
Дело не в этом, а в том, что в таких случаях нужно делать @var ClassName|null. false не для этого. Ну и проверять просто if ($var). Тогда всегда можно спокойно передавать аргументом в методы с сигнатурой (ClassName $var = null) не городя идиотских проверок. Ну и код бы процитированный выглядел как $this->_items = $this->_parent ? $this->_parent->getChildren() : null (ну и хочется это унести в метод $this->getItems() с lazy load).
 

fixxxer

К.О.
Партнер клуба
Ой, а там метод getItems уже и есть, и вот такое странное при этом

PHP:
    public function getParent()
    {
        if (!is_object($this->_parent))
        {
            $this->getItems();
        }
        return $this->_parent;
    }
то есть ответственность за инициализации размазана по коду.

Говнокод, говнокод, не спорьте.
 

AmdY

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

fixxxer

К.О.
Партнер клуба
я вообще не понимаю как пользоваться второй доктриной.

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

keltanas

marty cats
fixxxer
Нельзя не согласиться )) Порой, чтобы сделать примитивный запрос приходится пол часа копаться в мануалах, вместо того, чтобы написать его за минуту.
Зато у нее мощный механизм связей, поддерживающий персистенцию по связи.
Короче говоря, прежде чем начать копать, нужно научится управлять экскаватором. Это про нее.

Про конструктор нет смысла говорить, наверное?
PHP:
   public function getListQuery( Template $template = null, User $account = null )
    {
        $qb = $this->createQueryBuilder('p');
        $qb->select('p','t')
            ->where( 'p.deleted = :deleted' )->setParameter( ':deleted', 0 );
        if ( $template ) {
            $qb->andWhere( 'p.template = :template' )->setParameter( ':template', $template );
        }
        if ( $account ) {
            $qb->innerJoin('p.template','t');
            $qb->andWhere( 't.account = :account' )->setParameter( ':account', $account );
        }

        return $qb->getQuery();
    }
 

weregod

unserializer
кстати,
PHP:
defined('_JEXEC') or die;
в файле с описанием класса тоже доставил
 

fixxxer

К.О.
Партнер клуба
keltanas
я про вторую доктрину. первая мне понятна вполне :)
че там в жумле не знаю

вторую я честно пытался осилить года полтора назад. Сначала офигел от криптографии в phpdoc и сотни вложенных кэшей, но подумал ладно, оверинжиниринг щас в моде, надо вникнуть, чтобы быть к курсе современных тенденций. Вникать так на серьезных примерах, решил сделать связку N:M. Все как по мануалу сделал, получил exception-ы с ничего не говорящим человеку, который это дело в первый раз видит, бэктрейсом в перденя доктриновских классов, пару часов убил на понять, что не так, ничего кроме невнятных багрепортов без комментариев не нашел, и снес к буям собачьим. :)

Главное что все это не решает реальных проблем, с которыми я сталкиваюсь. Например, менеджера транзакций вообще нигде нет правильного: вот есть у меня два соединения, я хочу очевидного - транзакцию с двухфазным коммитом через менеджер. А хрен. Все приходится делать самому. Консистентность баз, простите, мне важнее, чем синтаксический сахар. :)

Конечно это ортогональные вещи, и никто не мешает иметь менеджер соединений, поддержку master-slave репликации, систему шардинга, кэширование в memcached с экспирацией зависимостей по тегам - и одновременно с этим умный ORM. Но почему-то все ORM написаны так, что добавить в них такие возможности сложее, чем написать ORM самому (хотя все перечисленное прекрасно ложится на orm-идеологию). А времени на написание своей полноценной ORM, умеющей работать со связами и поддерживающий все многообразие SQL-синтаксиса того же mysql (без чего нельзя говорить об оптимизации запросов) я потрачу больше, чем буду пользоваться простейшим query builder-ом и в небанальных случаях писать простой старый добрый SQL. Хотя мысли написать такую ORM в голове все время крутятся, да...
 

Zvook

Новичок
fixxxer
Полностью с вами согласен про доктрину, она и первая то была не особо понятная, а вторая вообще ужас
PS Propel мне как-то больше по душе )
 
Сверху