Pull to refresh

Полезные мелочи программирования на PHP

PHP *
Язык программирования PHP очень и очень свободный. Из-за этого, к сожалению, есть много способов написать тоже самое и не знать, что можно лучше. В этом топике я опишу несколько мелочей, полезных начинающим и немного продвинутым PHP программистам.

Содержание






echo
или
print


Функциональность


php.net предлагает небольшую статейку о разнице между ними, но она не очень информативна

Функциональная разница между ними только та, что


print()


возвращает

1
, а

echo
ничего не возвращает. Сказаться это может если только в таком коде:<br>

($success) ? echo 'Ура!': echo 'Увы...';

<br>

print
тут работал бы. В любом случае такое предложение в PHP не корректно и лучше было бы использовать
<br>

echo ($success) ? 'Ура!' : 'Увы...';.


Разница не в счёт, поэтому будем говорить о них как об одинаковых конструктах.


Скорость



echo
ничего не возвращает и поэтому чуть-чуть быстрее. Разница в парсинге смешная, но вот что интереснее: «echo» — четыре буквы, лежащие очень удобно под рукой, а «print» — пять, и чуть похуже расположенных.
В скорости

echo
предпочтительней.

Вывод


Можно много говорить о том, что разница в скорости очень мизерная, но если разницы в функциональности никакой, то зачем использовать

print
? Наш выбор —

echo
!

Постройка текста для вывода


(здесь я буду использовать
echo
, но всё так-же относится и к
print
)

Выясняем отношения с кавычками


Два вида кавычек используются в PHP для вывода текста — простые (
'
) и двойные (
"
). Разница между ними очень большая.
В простых кавычках парсер ищет только простую кавычку (как символ конца) и обратный слэш (для ввода простой кавычки). В двойных же парсер умеет многое другое. Например — видеть переменные (
echo "Hello, $name!";
), символы (
echo "Hello\nworld!";
) и даже более хитрые переменные (
echo "${config['hello']}, ${position}th world!";
).
Очевидно, что простые кавычки побыстрее, парсеру почти не надо думать. Но самое главное — это читабельность кода. Конструкции в двойных кавычках не только тяжелее воспринимать взглядом, многие редакторы с подсветкой кода их не могут разглядеть (разумеется, такие монстры, как ZDE справляются с этим без проблем, но ведь человек, редактирующий код после Вас может его и не иметь).

Точка или запятая?


Команда
echo
имеет такой синтаксис:
echo string $arg1 [, string $...] )
, т. е. можно писать как
echo 'Hello,' , 'world!';
так и
echo 'Hello,' . 'world!';
. В первом случае мы передаём два параметра, во втором один: склееный оператором склейки. Используя точку мы заставляем парсер на время всё схватить в память и склеить, как указывает Wouter Demuynck, поэтому запятые оказываются побыстрее (разумеется, проверено тестами).

heredoc?


В PHP есть конструкция «HEREDOC». Выглядит она так:


echo <<<HEREDOC<br>
Hello,<br>
world,<br>
I love you!<br>
HEREDOC;<br>


Здесь вместо «HEREDOC» может быть что угодно.

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

Конец строки



define('N',PHP_EOL); echo 'foo' . N;
читабельнее чем
echo "foo\n";<br>
echo 'foo' . "\n";
, но это сугубо моё мнение и здесь я не уверен.

Смысл ?>


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


functions.php:<br>
<php<br>
function foo()<br>
{<br>
...<br>
}<br>
function bar()<br>
{<br>
...<br>
}<br>



php.net и Zend Framework тоже так <a href="думают.

require, include, readfile


Часто эти функции используются без понимания разницы между ними.

readfile


readfile
просто выбрасывает содержимое файла в output. Если вам надо показать меню или баннер, то эта функция — как раз.

include и require


Эти две функции парсят содержимое файла, как PHP файла.
require
, не найдя файла говорит «Аааа! Стойте!» и бросает фатальную ошибку.
include
же относится к ошибке спокойно и просто даёт warning, не прерывая выполнения. Вывод — require нужна гораздо чаще.

..._once?



include 
и

require
можно пополнять постфиксом «_once»:

include_once; require_once<
. В таком случае парсер проверит, может он уже эти файлы добавил? Удобно для подключения библиотек в больших проектах. Можно не боясь добавлять

require_once
в каждый модуль, где нужна библиотека.

Запись в файл


Запись в файл с пятой версии PHP очень проста:

file_put_contents('filename','data');

Для сохранения backwards-compatibility, можно использовать этот код:

// File put contents
if (!defined('FILE_APPEND')) define('FILE_APPEND',1);
if (!function_exists('file_put_contents'))
{
	function file_put_contents($n, $d, $flag = false) {
		$mode = ($flag == FILE_APPEND || strtoupper($flag) == 'FILE_APPEND') ? 'a' : 'w';
		$f = @fopen($n, $mode);
		if ($f === false) {
			return 0;
		} else {
			if (is_array($d)) $d = implode($d);
			$bytes_written = fwrite($f, $d);
			fclose($f);
			return $bytes_written;
		}
	}
}
Tags:
Hubs:
Total votes 137: ↑124 and ↓13 +111
Views 20K
Comments Comments 181