За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое

Сайт упал из-за ECHO

Март4
Дидактические материалы по геометрии Гусев 8 класс.

Привет, уважаемые читатели!

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

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

Итак. Я работаю с ZendFramework. В одном из проектов который я создаю было задача построения не простой формы, следовательно вывести во вьюхе:

<?php echo $this->form;?>

я не смог из-за сложной верстки (декорировать на зенде — дольше, чем на голом ХТМЛе создать), я просто разобрал созданную в контроллере форму по элементам:

$itemsList = $this->form->getElements ();

в таком виде я получил массив всех элементов, ключами массива служили название полей в форме, а значение — объект данного поля (валидаторы, декораторы и тд).

При построении кнопок в данной форме я воспользовался конструкцией тернарного оператора:

<?php echo isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>

В форме при разных условиях часть кнопок отсутствовала, поэтому юзал условия.

При такой конструкции сайт ВАЛИТСЯ!!! Никаких сообщений нет, трейса нет, в логе-апача ничего нет — полный ГОЛЯК! Нашел я эту проблему методом «научного тыка».

Ну как ни у кого нет мысли почему эти строки валили сайт, еще скажу, если выводить какую-то одну из строк — все ОК?!

В общем дело в том, что именно оператор ECHO виновен, он не смог преобразовать объект в строку и выдать её, при этом никакого предупреждения не выдав!!!!!!!!

Если переписать эти строки вот так:

<?php print isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php print isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>

, т.е. заменить echo на print все нормально срабатывало.

Как бы я не крутил конструкция с эхо, скобочки разные, короткое сокращение эхо, и тд ничего не происходило. Помогло только явное приведение к строке с помощью конструкции (string), или конкатенация с пустой строкой, или приведение к типу с помощью ООП метода __toString();

<?php echo isset($itemsList["submit"]) ? (string)$itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? (string)$itemsList["reset"] : ''?>
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"].' ' : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"].' ' : ''?>
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"]->__toString() : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"]->__toString() : ''?>

Но самое, что для меня не понятное, почему если, я расписал условие в полном объеме:

if(isset($itemsList["submit"]))
{
	echo  $itemsList ["submit"];
}

if(isset($itemsList["reset"]))
{
	echo  $itemsList ["reset"];
}

все выполняется, заметьте, преобразованием типа я не занимался!!!

Вот часть кодов, может кто хочет протестировать:
Класс формы

public function __construct($options = null)
{
.....
	$this->_options = $options;
.....
}

public function init()
{
.....
	$this->addElement(
		'submit', 
		'submit', 
		array(
			'label' => 'submit', 
			'class' => 'but', 
			'decorators' => array('ViewHelper'), 
			'title'=>'submit'
		)
	);

	$this->addElement(
			'submit',
			'reset',
			array(
					'label'=>'reset',
					'class' => 'but',
					'decorators' => array('ViewHelper'),
					'title'=>'reset'
			)
	);
.....
}

protected $_options = array();

Контроллер

$form = new Module_Forms_MyForm(array('some options'));
.....
$this->view->form = $form;

Вьюха

$itemsList = $this->form->getElements ();

<form ....>
.....
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>
.....
</form>

Плиз, оставь свои мнения, почему в тернарном операторе эхо не сработало, а в общем условии — все ок!! Очень интересно знать, отвечу на любые вопросы.

UPD: Забыл сказать, все это без каких либо изменений работет по виндой, но подлинухом не работает!

Статья просмотренна 48983 раз, зашло посетителей 11738

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Сентябрь 2017
Пн Вт Ср Чт Пт Сб Вс
« Июл    
 123
45678910
11121314151617
18192021222324
252627282930  

Сейчас на сайте