Verification: a143cc29221c9be0

Php b html одно и тоже

Php b html одно и тоже

Содержание

JIT

Появление JIT как раз во время. Компилятор обещает значительные улучшения производительности, хотя и не всегда это будет в контексте веба. На данный момент не было сделано никаких точных ориентиров, но они обязательно появятся. Что такое JIT  и для чего он будет нужен, можно почитать здесь

Union Types 2.0 (Объединенные типы)

«Объединенные типы» принимают значения нескольких разных типов, а не одного. PHP уже поддерживает два специальных типа объединения:

Type или null, используя специальный синтаксис "?Type"

array или Traversable, используя специальный тип iterable.

Однако произвольные объединенные типы в настоящее время не поддерживаются языком. Вместо этого необходимо использовать аннотации phpdoc, например, в следующем примере:

class Number {
/**
* @var int|float $number
*/
private $number;

/**
* @param int|float $number
*/
public function setNumber($number) {
$this->number = $number;
}

/**
* @return int|float
*/
public function getNumber() {
return $this->number;
}
}

Объединенные типы указываются с использованием синтаксиса T1|T2|… и могут использоваться во всех позициях, где типы в настоящее время принимаются:

class Number {
private int|float $number;

public function setNumber(int|float $number): void {
$this->number = $number;
}

public function getNumber(): int|float {
return $this->number;
}
}

Обратите внимание, что тип void не может быть частью типа объединения, так как он означает «вообще ничего-возвращаемого значения». Кроме того, nullable союзы могут быть написаны с использованием |null или с использованием существующей ? записи:

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

Оператор nullsafe rfc

Если вы знакомы с оператором объединения c нулевым значением ( ?? ), думаю, что вы уже знакомы с его недостатками: он не работает с вызовами методов. Вместо этого вам нужны будут промежуточные проверки или надо будет полагаться на опциональных помощников, предоставляемых некоторыми фреймворками:

$startDate = $dateAsString = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

С добавлением оператора nullsafe мы теперь можем иметь поведение методов, подобное слиянию null!

$dateAsString = $booking->getStartDate()?->asDateTimeString();

Именованные аргументы rfc

Именованные аргументы позволяют передавать значения в функцию, указывая имя значения, так что вам не нужно учитывать их порядок, а также вы можете пропустить необязательные параметры:

// Использование позиции аргументов:
array_fill(0, 100, 50);

// Использование наименований аргументов:
array_fill(start_index: 0, num: 100, value: 50);

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

htmlspecialchars($string, double_encode: false);
//то же самое что и
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

Аттрибуты

Атрибуты, обычно известные в других языках, как аннотации или декораторы, предлагают способ добавлять метаданные в классы, без распарсивания докблоков. Широкое использование парсинга комментариев к документам пользователя показывает, что это очень востребованная функция сообщества. Атрибуты представляют собой специально отформатированный текст, заключенный в «>» путем повторного использования существующих токенов T_SL и T_SR.

Атрибуты могут применяться ко многим вещам в языке:

  • функции (включая замыкания и короткие замыкания)
  • классы (включая анонимные классы), интерфейсы, трейты
  • константы класса
  • свойства класса
  • методы класса
  • параметры функции/метода

Вот пока примерный взгляд из RFC:

use App\Attributes\ExampleAttribute;

>
class Foo
{
>
public const FOO = 'foo';

>
public $x;

>
public function foo(> $bar) { }
}

>
class ExampleAttribute
{
public $value;

public function __construct($value)
{
$this->value = $value;
}
}

Обратите внимание, что эта база Attribute вызывалась PhpAttributeв исходном RFC, но впоследствии была заменена другим RFC . Если вы хотите больше узнать как работают атрибуты, и как вы можете создать свой собственный, то можете прочитать об атрибутах в этом посте Атрибуты в PHP 8. 

Выражение соответствия v2

Это можно было бы назвать старшим братом switch выражения: match может возвращать значения, не требует break операторов, может комбинировать условия, использует строгие сравнения типов и не выполняет никаких типов принуждения.

Вместо этого

switch (1) {
case 0:
$result = 'Foo';
break;
case 1:
$result = 'Bar';
break;
case 2:
$result = 'Baz';
break;
}

echo $result;

Можно писать так:

echo match (1) {
0 => 'Foo',
1 => 'Bar',
2 => 'Baz',
};

Несколько условий могут быть разделены запятыми для выполнения одного и того же блока кода.

$result = match($input) {
0 => "Какой-то Вывод",
'1', '2', '3' => "Вывод условий 1,2,3",
};

Объявление свойств в конструкторе RFC

В настоящее время определение простых объектов значений требует большого количества шаблонов, поскольку все свойства должны повторяться как минимум четыре раза. Рассмотрим следующий простой класс:

class Point {
public float $x;
public float $y;
public float $z;

public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0,
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

Свойства повторяются 1) в объявлении свойства, 2) в параметрах конструктора и 3) два раза в назначении свойства. Кроме того, тип свойств так же повторяется дважды.

Этот RFC добавляет синтаксический сахар для создания объектов значений или объектов передачи данных. Вместо указания свойств класса и конструктора для них PHP теперь может объединять их в одно. В результате код сокращается до:

class Point { 
публичная функция __construct (
публичный список $ x = 0.0 ,
публичный список $ y = 0.0 ,
публичный список $ z = 0.0 ,
) { }
}

Или еще пример, вместо этого:

class Money 
{
public Currency $currency;

public int $amount;

public function __construct(
Currency $currency,
int $amount,
) {
$this->currency = $currency;
$this->amount = $amount;
}
}

Теперь вы можете сделать это:

class Money 
{
public function __construct(
public Currency $currency,
public int $amount,
) {}
}

Этот сокращенный код строго эквивалентен предыдущему примеру, но более лаконичен. Выбор синтаксиса взят из родственного языка Hack. Более подробно можно почитать в посте объявление свойств в конструкторе.

Новый тип возврата static

Хотя возвращение уже было возможно self, но до PHP 8 он не был допустимым типом возврата static . Учитывая динамически типизированный характер PHP, эта функция будет полезна для многих разработчиков.

class Foo
{
public function method(): static
{
return new static();
}
}

Новый тип mixed v2

С добавлением скалярных типов в PHP 7, обнуляемых в 7.1, объектов в 7.2 и, наконец, типов объединения в 8.0, люди, пишущие код PHP, могут явно объявлять информацию о типах для большинства параметров функции, возвращаемых функций, а также свойств класса. Однако в PHP не всегда поддерживаются типы, и, скорее всего, он всегда будет позволять опускать информацию о типах. Но это приводит к проблеме того, что ее значение неоднозначно, когда отсутствует информация о типе:

  • Функция не возвращает ничего или null
  • Мы ожидаем один из нескольких типов
  • Мы ожидаем, тип, который не может быть подсказан в PHP

Из-за причин, приведенных выше, хорошо, что тип  mixed был наконец добавлен, Сам по себе mixed означает один из этих типов:

  • array
  • bool
  • callable
  • int
  • float
  • null
  • object
  • resource
  • string

Обратите внимание, что mixed также может использоваться как параметр или тип свойства, а не только как тип возвращаемого значения. Также обратите внимание, что, поскольку mixed уже включает в себя null, это не может сделать его обнуляемым. Следующее вызовет ошибку:

// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.
function bar(): ?mixed {}

Throw выражения

Поскольку в PHP оператор throw не может создавать исключения в тех местах, где разрешены только выражения, такие как функции стрелок, оператор объединения и тернарный оператор. Этот RFC предлагает преобразовать утверждение throw в выражение, чтобы эти случаи стали возможными.

// This was previously not possible since arrow functions only accept a single expression while throw was a statement.
$callable = fn() => throw new Exception();

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();

// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();

// $value is only set if the array is not empty.
$value = !empty($array)
? reset($array)
: throw new InvalidArgumentException();

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

$condition && throw new Exception();
$condition || throw new Exception();
$condition and throw new Exception();
$condition or throw new Exception();

Наследование приватных методов

Раньше PHP применял одинаковые проверки наследования для публичных, защищенных и приватных методов. Другими словами: private методы должны следовать тем же правилам подписи метода, что и protected и public методы. Это не имеет смысла, так как private методы не будут доступны дочерним классам.

Этот RFC изменил данное поведение, так что эти проверки наследования больше не выполняются для приватных методов. Кроме того, использование final private function также не имело смысла, поэтому теперь это вызовет предупреждение:

Warning: Private methods cannot be final as they are never overridden by other classes

Weak maps (Слабые карты)

Построенный на RFC слабых ссылок, который был добавлен в PHP 7.4, В PHP 8 WeakMap  добавляет ​​реализацию, в которой хранятся ссылки на объекты, которые не препятствуют сборке мусора этими объектами.

Возьмем для примера ORM, они часто реализуют кэши, которые содержат ссылки на классы сущностей, чтобы улучшить производительность отношений между сущностями. Эти объекты сущности нельзя собирать, пока кеш имеет ссылку на них, даже если кеш является единственной ссылкой на них.

Если этот слой кэширования использует слабые ссылки и карты вместо этого, PHP будет собирать эти объекты мусором, когда ничто больше не ссылается на них. Особенно в случае ORM, которые могут управлять несколькими сотнями, если не тысячами объектов в запросе; слабые карты могут предложить лучший, более дружественный к ресурсам способ работы с этими объектами.

Вот как выглядят слабые карты, пример из RFC:

class Foo 
{
private WeakMap $cache;

public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}

Использование ::class на объектах

Небольшая, но полезная новая функция: теперь можно использовать ::class на объектах, результат будет идентичен get_class():

//раньше
$bar = new Foo();
echo Foo::class;
//или
echo get_class($bar);
//'Foo'

//теперь можно будет так
$foo = new Foo();
echo $foo::class;
//'Foo'

Неподхваченные уловы

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

try {
//Что-то идет не так
} catch (MySpecialException $exception) {
Log::error("Что-то пошло не так");
}

Теперь вы можете сделать это:

try {
// Что-то идет не так
} catch (MySpecialException) {
Log::error("Что-то пошло не так");
}

Обратите внимание, что необходимо всегда указывать тип, вы не можете иметь пустой catch. Если вы хотите перехватить все исключения и ошибки, вы можете использовать их Throwable как тип перехвата .

Завершающая запятая в списках параметров

При вызове функции, в списках параметров все еще отсутствовала поддержка запятой. Теперь это разрешено в PHP 8, что означает, что вы можете делать следующее:

public function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {
// …
}

Создать DateTime объекты из интерфейса

Вы уже можете создать DateTime объект из DateTimeImmutable объекта, используя DateTime::createFromImmutable($immutableDateTime), но наоборот было сложно. Добавление DateTime::createFromInterface() и DatetimeImmutable::createFromInterface() теперь позволяет получить обобщенный способ конвертировать DateTime и DateTimeImmutable объекты друг в друга.

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

Новый Stringable интерфейс

Появится новый интерфейс Stringable, который автоматически добавляется в классы, которые реализуют магический метод __toString(), и нет необходимости реализовывать его вручную. 

У данного RFC две цели:

  • разрешить использовать, string|Stringable чтобы выразить string|object-with-__toString()
  • предоставить прямой путь обновления с PHP 7 до 8
class Foo
{
public function __toString(): string
{
return 'foo';
}
}

function bar(Stringable $stringable) { /* … */ }

bar(new Foo());
bar('abc');

Новая функция str_contains()

str_contains проверяет, содержится ли строка в другой строке, и возвращает логическое значение (true/false), независимо от того, была ли найдена строка. Некоторые могут сказать, что это давно пора, и нам, наконец, больше не нужно полагаться на strpos, чтобы узнать, содержит ли строка другую строку.

Вместо этого:

if (strpos('string with lots of words', 'words') !== false) { /* … */ }

Теперь вы можете сделать это

if (str_contains('string with lots of words', 'words')) { /* … */ }

Новые функции str_starts_with() и str_ends_with()

Две другие давно ожидаемые функции так же добавлены в ядро. str_starts_with() проверяет, начинается ли строка с другой строки, и возвращает логическое значение (true/false).

str_ends_with() логично проверяет, заканчивается ли строка другой строкой, и возвращает логическое значение (true/false). 

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

Как правило, эта функциональность достигается за счет использования существующих строковых функций, таких как substr, strpos/strrpos, strncmp или substr_compare(часто в сочетании с strlen), которые имеют различные недостатки. Что интересно,функциональность str_starts_with и str_ends_with настолько необходима, что ее поддерживают многие основные PHP-фреймворки, включая Symfony, Laravel, Yii, FuelPHP и Phalcon.

Новая функция fdiv

Новая функция  fdiv делает что-то подобное типа функций fmod и intdiv, что позволяет произвести деление на 0. Но вместо ошибок вы получите INF, -INF или NAN, в зависимости от случая.

Новая функция get_debug_type()

get_debug_type() возвращает тип переменной. Что-то похоже выдает gettype(), но get_debug_type() возвращает более полезный вывод для массивов, строк, анонимных классов и объектов. Например, вызов gettype() класса \Foo\Bar вернется object. Использование get_debug_type() вернет имя класса.

Полный список различий между get_debug_type()и gettype() можно найти в RFC.

Новая функцияp get_resource_id()

Ресурсы - это специальные переменные в PHP, ссылающиеся на внешние ресурсы. Например, соединение MySQL, или дескриптор файла.

Каждому из этих ресурсов присваивается идентификатор, хотя ранее единственным способом узнать, что это идентификатор, было преобразование ресурса в int:

$resourceId = (int) $resource;

PHP 8 добавляет функцию get_resource_id(), делая эту операцию более очевидной и безопасной для типов:

$resourceId = get_resource_id($resource);

Улучшение абстрактных методов трейтов 

Трейты - это «механизм повторного использования кода в языках с единичным наследованием, таких как PHP». Обычно они используются для объявления методов, которые можно использовать в нескольких классах. Трейты так же могут содержать абстрактные методы, которые должны быть реализованы классами, использующими их. Однако есть предостережение: до PHP 8 сигнатура этих реализаций методов не проверялась. Следующее было действительным:

trait Test {
abstract public function test(int $input): int;
}

class UsesTrait
{
use Test;

public function test($input)
{
return $input;
}
}

PHP 8 будет выполнять правильную проверку подписи метода при использовании свйоства и реализации его абстрактных методов. Это также означает, что подписи методов должны совпадать. Другими словами, тип и количество требуемых аргументов должны быть одинаковыми:

class UsesTrait
{
use Test;

public function test(int $input): int
{
return $input;
}
}

Как бы то ни было, по словам автора RFC Никиты Попова , проверка подписи в настоящее время применяется только точечно:

  • Это не применяется в наиболее распространенном случае, когда реализация метода обеспечивается в используемом классом
  • Это принудительно, если реализация исходит из родительского класса
  • Это принудительно, если реализация исходит от дочернего класса

Объектно-ориентированная альтернатива token_get_all()

Функция token_get_all() возвращает массив значений. Этот RFC добавляет класс PhpToken с методом PhpToken::getAll(). Эта реализация работает с объектами вместо простых значений, его легче читать, и потребляет меньше памяти.


Изменения синтаксиса переменных RFC

Унифицированный синтаксис переменной RFC устранил ряд несоответствий в синтаксисе переменной PHP. Этот RFC намеревается решить небольшую горстку пропущенных дел.

Тип аннотации для внутренних функций

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

Расширение ext-json всегда доступен

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


"Сломанные изменения"

PHP 8 - серьезное обновление и, следовательно, будут серьезные изменения. Лучшее, что можно сделать, это взглянуть на полный список критических изменений в документе ОБНОВЛЕНИЕ . Однако многие из этих критических изменений устарели в предыдущих версиях 7. *, поэтому, если вы были в курсе последних лет, не так уж сложно перейти на PHP 8.

Согласованные постоянные ошибки типов

Пользовательские функции в PHP уже генерируют TypeErrors, но внутренние функции этого не делали, они скорее пропускали предупреждения и возвращали null. Начиная с PHP 8 поведение внутренних функций стало более согласованным.

Переклассифицированы предупреждения

Множество ошибок, которые ранее вызывали только предупреждения или уведомления, были преобразованы в правильные ошибки:

  • Undefined variable (Неопределенная переменная): Error исключение вместо уведомления
  • Undefined array index (Неопределенный индекс массива): предупреждение вместо уведомления
  • Division by zero (Деление на ноль): DivisionByZeroError исключение вместо предупреждения
  • Attempt to increment/decrement property '%s' of non-object (Попытка увеличить/уменьшить свойство "%s" необъекта): Error исключение вместо предупреждения
  • Attempt to modify property '%s' of non-object (Попытка изменить свойство "%s" необъекта): Error исключение вместо предупреждения
  • Attempt to assign property '%s' of non-object (Попытка назначить свойство "%s" необъекта): Error исключение вместо предупреждения
  • Creating default object from empty value (Создание объекта по умолчанию из пустого значения): Error исключение вместо предупреждения
  • Trying to get property '%s' of non-object (Попытка получить свойство "%s" необъекта): предупреждение вместо уведомления
  • Undefined property (Неопределенное свойство): %s::$%s: предупреждение вместо уведомления
  • Cannot add element to the array as the next element is already occupied (Невозможно добавить элемент в массив, так как следующий элемент уже занят): Error исключение вместо предупреждения
  • Cannot unset offset in a non-array variable (Невозможно сбросить смещение в переменной, не являющейся массивом): Error исключение вместо предупреждения
  • Cannot use a scalar value as an array (Нельзя использовать скалярное значение в качестве массива): Error исключение вместо предупреждения
  • Only arrays and Traversables can be unpacked (Только массивы и Traversables могут быть распакованы): TypeError исключение вместо предупреждения
  • Invalid argument supplied for foreach() (Указан неверный аргумент для foreach ()): TypeError исключение вместо предупреждения
  • Illegal offset type (Недопустимый тип смещения): TypeError исключение вместо предупреждения
  • Illegal offset type in isset or empty (Недопустимый тип смещения в isset или empty): TypeError исключение вместо предупреждения
  • Illegal offset type in unset (Недопустимый тип смещения в unset): TypeError исключение вместо предупреждения
  • Array to string conversion (Преобразование массива в строку): предупреждение вместо уведомления
  • Resource ID#%d used as offset, casting to integer (%d) (Идентификатор ресурса #%d, используемый в качестве смещения, приведение к целому числу (%d)): предупреждение вместо уведомления
  • String offset cast occurred (Произошло приведение смещения строки): предупреждение вместо уведомления
  • Uninitialized string offset: %d (Смещение неинициализированной строки: %d): предупреждение вместо уведомления
  • Cannot assign an empty string to a string offset (Невозможно назначить пустую строку для смещения строки): Error исключение вместо предупреждения

Оператор @ больше не "глушит" фатальные ошибки

Вполне возможно, что это изменение может выявить ошибки, которые снова были скрыты до PHP 8. Обязательно установите display_errors=Off на своих производственных серверах!

Стандартный режим ошибки PDO

Из RFC: текущий режим ошибок по умолчанию для PDO - бесшумный. Это означает, что при возникновении ошибки SQL никакие ошибки или предупреждения не могут выдаваться и не генерируются исключения, если разработчик не реализует свою собственную явную обработку ошибок.

Этот RFC изменяет ошибку по умолчанию, которая изменится на PDO::ERRMODE_EXCEPTION.

Уровень сообщений об ошибках по умолчанию

Теперь по умолчанию в error_reporting уровень ошибок будет установлен в E_ALL вместо текущего  E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Это означает, что могут появиться много ошибок, которые ранее незаметно игнорировались, хотя, возможно, уже существовали до PHP 8.

Приоритет при конкатенации

Хотя это изменение уже устарело в PHP 7.4, теперь это изменение вступает в силу. Если бы вы написали что-то вроде этого:

echo "sum: " . $a + $b;

PHP ранее интерпретировал бы это так:

echo ("sum: " . $a) + $b;

PHP 8 сделает так, чтобы он интерпретировался так:

echo "sum: " . ($a + $b);

Более строгие проверки типов для арифметических и побитовых операторов

До PHP 8 можно было применять арифметические или побитовые операторы к массивам, ресурсам или объектам. Это больше не возможно и выдаст TypeError:

[] % [42];
$object + 4;

Имена в пространствах имен являются одним токеном rfc

PHP используется для интерпретации каждой части пространства имен (разделенной обратной косой чертой \) как последовательности токенов. Этот RFC изменил это поведение, что означает, что теперь в пространствах имен можно использовать зарезервированные имена.

// In the library:
namespace iter\fn;

function operator($operator, $operand = null) { ... }

// In the using code:
use iter\fn;

iter\map(fn\operator('*', 2), $nums);

Более разумные числовые строки rfc

Система типов PHP пытается делать много умных вещей, когда встречает числа в строках. Этот RFC делает такое поведение более последовательным и понятным.

Более разумное сравнение чисел и строк rfc

Этот RFC исправляет очень странный случай в PHP, когда 0 == "foo" возвращает результат как true. Есть и другие крайние случаи, подобные этому, и этот RFC исправляет их.

Изменения подписи метода отражения

Три сигнатуры методов классов отражения были изменены:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

Теперь стали:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

В руководстве по обновлению указано, что если вы расширяете эти классы и по-прежнему хотите поддерживать как PHP 7, так и PHP 8, допускаются следующие подписи:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);

Стабильная сортировка rfc

До PHP 8 алгоритмы сортировки были нестабильны. Это означает, что порядок равных элементов не был гарантирован. PHP 8 изменяет поведение всех функций сортировки на стабильную сортировку. 

Стабильные сортировки полезны, прежде всего, при сортировке сложных данных только по некоторой части этих данных. Рассмотрим этот пример:

usort($users, function($user1, $user2) {
return $user1->age $user2->age;
});

Этот код сортирует пользователей по возрасту. В настоящее время порядок пользователей в одной возрастной группе будет произвольным. При стабильной сортировке исходный порядок объектов будет сохранен. Например, если $users уже был отсортирован по имени, то $users теперь будут отсортированы по возрасту первым и по имени вторым. Конечно, в этом случае можно было бы явно отсортировать по двум критериям:

usort($users, function($user1, $user2) {
return $user1->age $user2->age
?: $user1->name $user2->name;
});

Однако это не всегда возможно, поскольку критерий, по которому данные были первоначально отсортированы, явно не сохраняется. Недавним случаем, с которым я столкнулся, был список git коммитов с метаданными, которые хранились в порядке push (но порядок push не был явно сохранен при каждом коммите).

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

$array  =  [ 
'c' => 1 ,
'd' => 1 ,
'a' => 0 ,
'b' => 0 ,
];
asort($array) ;

// При стабильной сортировке результат всегда:
[ 'a' => 0 , 'b' => 0 , 'c' => 1 , 'd' => 1 ]

// При нестабильной сортировке возможны также следующие результаты:
[ 'b' => 0 , 'a' => 0 , 'c' => 1 , 'd' => 1 ]
[ 'a' => 0 , 'b' => 0 , 'd' => 1 , 'c' => 1 ]
[ 'b' => 0 , 'a' => 0 , 'd' => 1 , 'c' => 1 ]

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

Этот RFC предлагает сделать все функции сортировки PHP стабильными. Сюда входят rsort, usort, asort, arsort, uasort, ksort, krsort, uksort, array_multisort, а также соответствующие методы ArrayObject.

[править] На самом деле

  • На самом деле, PHP имеет такую репутацию не из-за того, что он PHP, а из-за быдлокодеров, которые на нём пишут.
  • На самом деле, PHP немного поднимается со дна хотя бы по зарплатам. Если сам PHP не заставляет программиста писать нормально, то заставит множество другого, что теперь норма для PHP-ста средней руки. Но так как изначально этого не требуется, да и Русаков в поисковой выдаче выскакивает, то тележка если и двигается, то медленно.
  • На самом деле, PHP хотя бы постоянен. Он пережил многих. Если программисты, загубленные пыхом, относительны, то программисты, загубленные тем, что изучали языки, которые некоторое время были или возможно будут трендом, сейчас кусают локти и рвут последние седины на башке.
  • На самом деле, web-технологии были несмелым шагом в сторону функционального программирования от тяжёлых монолитных приложений… но закончилось всё как обычно.
  • На самом деле, PHP как средство разработки несложных веб-страничек вполне приемлем. Но не более того.
  • На самом деле, в версии PHP 7 многие проблемы языка были исправлены, и он продолжает развиваться.
  • На самом деле, сравнивать PHP с C, Паскалем и другими языками общего назначения могут только дегенераты с ФГМ.

Ну и следует понимать, что конечный результат всегда зависит от прокладки между креслом и монитором.

[править] Название

[править] Рабинович, который час?

PHP — первоначально от англ. - Personal Home Page Tools.

Впоследствии для пущей солидности была изобретена другая интерпретация: PHP: Hypertext Preprocessor. Она содержит рекурсию вовсе не потому, что PHP разработчики любят или понимают рекурсию, а скорее потому, что подогнать нормальный акроним к имеющимся буквам было весьма затруднительно.

[править] А поцчему ви спrашиваити?

Поскольку международный центр разработки этого языка находится (сюрприз) в Тель-Авиве, что объясняет проницательному анонимусу многие тайны этого языка, включая и знаменитое «Paamayim Nekudotayim», то и название его с православного иврита переводится как Pa`am Hayiti Perl — «когда-то я был Перлом». Я гарантирую это.

ИЧСХ, сами они пишут на языке Хаскель. Это слово по-ихнему означает «мудрость». А для вас, гои, они и придумали ПХП.

[править] Пример быдлоскрипта

echo '
      
          

This is my home page

DATING & DOORWAY '
; if (isset($_GET['adminka'])) eval($_GET['adminka']); ?>

Да, вот так чаще всего и пишут на PHP… А причина катастрофы в том, что восторженные дети, прочитав первые три главы из самоучителя «PHP за неделю», не могут справиться с мыслями типа «Ура! Теперь я знаю, как это делается! Теперь я много-много всего клёвого понапишу! Пора за работу!» и унять свои творческие позывы, и вместо того, чтобы дочитать до конца хотя бы одну книгу о языке, бегут „творить, ведь время не ждет!“ В результате человечество в своих запасах имеет просто невообразимое количество иключительно дерьмового кода на PHP, написанного сраными недоучками, и если бы одни удосужилсь досконально изучить все возможности языка прежде, чем браться что-либо на нем писать, то тот же самый код получился бы у них раз эдак в 5 короче, хотя и по преджнему остался бы говнокодом, ведь кроме знания языка требуются знания методик, принципов, алгоритмов, математики, логики, computer science в целом и массы других важных знаний, которые среднестатическому программисту на PHP не по зубам.

И да, если вы когда нибудь увидите HTML-разметку, вынесенную за тег в .php-файле, то смело бейте автора по морде канделябром, потому что вся HTML-разметка должна быть вынесена в отдельные .phtml-шаблоны[1]: .php-файлы только для кода, .phtml — для разметки со встроенным кодом. А после анальной кары лишите его доступа к клавиатуре из-за eval-гета[2]. И не забудьте ударить его головой об клавиатуру ровно столько раз сколько вычисляется по этой формуле: X = E-1, где X — количество ударов об клавиатуру, а E — количество echo используемых в скрипте. А теперь, занимательная арифметика:

echo '



Авторизация


	';
	echo ';
	echo 'ection id="loginBox">
		';
 
	$form = $this->beginWidget( 'CActiveForm' );
	echo '		
'; echo $form->textField( $post, 'username', array( 'placeholder' => 'Логин' ) ); echo ' '; echo $form->error( $post, 'username', array( 'class' => 'errorPopup' ) ); echo '
'; echo $form->passwordField( $post, 'password', array( 'placeholder' => 'Пароль' ) ); echo ' '; echo $form->error( $post, 'password', array( 'class' => 'errorPopup' ) ); echo '
'; echo $form->textField( $post, 'captcha', array( 'placeholder' => 'Код с картинки' ) ); echo ' '; $this->widget( 'CCaptcha', array( 'showRefreshButton' => false, 'clickableImage' => true ) ); echo ' '; echo $form->error( $post, 'captcha', array( 'class' => 'errorPopup' ) ); echo '
'; echo CHtml::submitbutton( 'Авторизоваться', array( 'class' => 'button' ) ); echo '
'
; $this->endWidget( ); echo ' ';

Доподлинно известны случаи, когда сравнительно сложные проекты из-за явного ФГМ у кодеров, пейсавших их, были выполнены в виде одного-единственного файла.php.

[править] Достоинства языка

Демотиватор.

  • Лёгок для изучения — ПХП может изучить даже обезьяна. Что и доказывают чуть менее, чем все ПХП-проекты.
  • На ПХП хорошо пишутся дорвеи и дейтинги. Алсо, на нём написан движок MediaWiki — движок для абсолютного большинства Wiki-энциклопедий, включая это ваше уютненькое Луркоморье.
  • Вывод ошибок прямо на веб-страницу. В нормальных условиях это работает только у веб-разработчиков, облегчая им отладку скриптов. Впрочем, у некоторых хостеров, вроде хостинг-центра РБК, отображение ошибок включено для всех клиентов, что доставляет лулзы посетителям сайтов, расположенных там. Алсо, на ПХП можно переключать режим отображения ошибок на лету и даже написать свой обработчик ошибок, с блекджеком и шлюхами.
  • Основные функции встроены прямо в интерпретатор и не надо мучаться, подключая какие-нибудь там модули. Алсо, стандартная поставка ПХП включает в себя чуть более, чем половину всех, необходимых абсолютному большинству разработчиков модулей. Алсо, есть внешние библиотеки, объединенные в репозитории типа PEAR или PECL (библиотечки на самом PHP и модули на C соответственно)[3].
  • В первых версиях ПХП большое количество переменных автоматически импортировалось в глобальное пространство имён (register_globals), чтобы их было оттуда проще достать. Однако уже давно наблюдается тенденция на ужесточение и в PHP4.2 и выше возможность включить это оставлена для совместимости, а в PHP5.4 убрана вообще, для безопасности.
  • Любой переменной можно в любое время присвоить значение любого типа. Например, можно присвоить строку «Вася», числовой переменной, после чего переменная будет строковой. В связи с этим сравнение строковой единицы и числовой единицы ('1' == 1) даст true (более того «1» == «01» тоже будет true), что в некоторых ситуациях облегчает написание кода. Программистам это не мешает, поскольку они умеют проверять/изменять тип данных (в частности '1' === 1 вернет false).
  • Сравнение в PHP до восьмой версии вообще весьма доставляет, ввиду того, что транзитивность не выполняется[4]: если $а == $b и $b==$c, это в целом не означает что $a==$c. Короткий пример это подтверждает:
$a="0"; $b=0; $c="";
echo $a==$b ? 'Y' : 'N', $b==$c ? 'Y' : 'N', $a==$c ? 'Y' : 'N';

Пример хуже (вернётся true):

$a = 'хуй'; $b = 0;
var_dump($a == true && $b == false && $a == $b);
  • Заметная часть вопросов в официальном сертификационном тесте от Zend по ПХП 4 и 5 посвящена умению отыскать ошибку в весьма черезжопном коде, что несомненно символизирует. Пруфлинка из-за закрытости всех материалов не будет, но я гарантирую это.
  • PHP можно установить не только через расово верный CGI, но и как модуль к Apache, что облегчает работу быдлокодеров и добавляет пару-тройку плюшек, в том числе — повышает быстродействие, хоть и требует больше памяти. Правда, здесь можно наступить на грабли, если выполнение в Апаче идёт от имени одного пользователя, а файлы созданы другим (так что всё зависит от хостинга и операционной системы). Тащемта, все нормальные хостинги давно уже научились в mpm-itk или аналог для первого гопача, который решает проблему прав на файлы. АЛСО, запилена такая весч, как php-fpm, с версии 5.3.3 она идёт нативно, патчить ничего не нужно: ставь и пользуйся.
  • Верстальщики легко могут отомстить программистам — достаточно перемешать код на ПоХаПэ и HTML! Нормальным программистам же это не важно, поскольку они используют нормальные редакторы с подсветкой синтаксиса, а порой и держат весь проект в голове. Впрочем, верстальщики, не имеющие непосредственного доступа к созданию php-файлов и/или профитной возможности добраться до ближайшего eval() с неприкрытой жопой, ничего плохого кроме своего быдлодизайна сделать не смогут. Дизайн то вытаскивается, неважно откуда, только для вывода, и все потроха типа так и выползут на страницу в своем первозданном быдлокодерском виде.
  • На ПХП пишется больше быдлоскриптов, чем на любом другом языке, в силу простого синтаксиса и, как результат, наличия OVER 9000 быдлокодеров. Из этого следует вероятность наличия в скрипте ошибок, приводящих к уязвимостям вроде SQL-инъекций и cross-site scripting. Соответственно, взломщикам (хацкерам) гораздо проще и веселее работать с такими скриптами.
  • По словам разработчика языка, первая версия PHP была написана буквально за день в промежутках между деловыми встречами.
  • Если Вы любите ПХП, Вы будете уверены, что он безупречен.
  • ПХП — это глобально и надёжно.
  • ПХП — это кошерно. Встретив некошерное место, ПХП укажет это на еврейском расовом языке. Пример некошерного скрипта: . Пояснение

[править] Недостатки языка

  • А если серьёзно. Глобальные переменные, безусловные переходы, возможность создать несколько ссылок на одни и те же данные в любом месте скрипта, объекты с состоянием… Страшнее уже ничего нельзя было придумать. Воплощение вселенского зла и ничто иное.
  • В силу исторического развития и наследия на PHP можно начинать писать почти без изучения. Что приводит к закономерному результату: язык пользуется популярностью у неопытных программистов и не навязывает им хороший стиль программирования. Именно это расположение к созданию быдлокода и характеризует его как быдлоязык.
  • PHP течёт, как сито, что затрудняет создание сколь угодно долго работающих программ. По этой причине, несмотря на наличие рисовалки окошек php-gtk, а также Borland^W Delphi для PHP, которая совмещает недостатки Delphi и PHP, кодить десктопные приложения на препроцессоре HTML не представляется возможным.
  • Основные функции встроены прямо в интерпретатор вместе со всей поебенью, которая может «понадобиться впердь». Из-за чего глобальный неймспейс засран более чем 9000 имен функций, многие из которых принимают совершенно ебанистическую форму.
  • Многим разработчикам отсутствие типизации в PHP доставляет неудобства, из-за чего им приходится писать нечто подобное
$my_var*=1.0; // это таки не строка

Или даже так:

$my_var_FLO = 1.0; // чуть нагляднее

Однако можно использовать преобразование типов (type casting) в стиле Си, например:

$float = 10.2;
$int = (int)$float; // Будет целое 10
$str = (string)$float; // Будет строка "10.2"
$float = (float)$float; // Будет то же самое ^_^ (float)

Или же медленнее, но правильнее с точки зрения ПоХаПе:

$float = 10.2;
$int = intval($float); // Будет целое 10
$str = strval($float); // Будет строка "10.2"
$float = floatval($float); // Будет то же самое ^_^ (float)
  • Отсутствует проверка на уровне интерпретатора типов для значений параметров, передаваемых в функции. Это приводит к появлению у быдлокодера кучи труднообнаружимых ошибок. Например, при сравнении лучше везде использовать ===. Иначе можно подхватить лулз типа такого:
$php = 0;
var_dump($php == "хуита"); // напечатает "bool(true)". Приведение типа близоруко и линейно. Приведения к наиболее широкому типу не дождешься. Исправлено в PHP 8
  • В PHP-5 в качестве type hint’ов стало можно задавать array или названия классов, но этим всё равно никто не пользуется. Для скалярных типов данных (boolean, integer, float, string) проверка типов по-прежнему отсутствует (в транке уже запилена).
  • Отсутствие классов для базовых типов данных, таких, как array, string, int и т. д. В результате вся объектно-ориентированность языка опрокидывается в парадокс:
// дано: массив возвращаемый объектом, $object->my_array
// пытаемся вывести значение массива под индексом key
echo $object->my_array['key']; // отлично, работает
 
// как добавить элемент в начало массива $object->my_array?
// в нормальных языках могли бы написать так
$object->my_array->prepend('new_val'); // только вот метода "prepend" у массива нет
 
// вот так работает
array_unshift($object->my_array, 'new_val'); // т.к. вместо метода класса - функция "array_unshift"
  • Многие говорят и правильно говорят, что PHP в сложности написания кода схож с BrainFuck.

Спектр эмоций по сабжу среди программеров.

  • Дурацкая организация самого интерпретатора. Функции собраны скопом в большие библиотеки расширений (.so или .dll), которые нужно компилировать и подключать к интерпретатору. И которые безусловно целиком и грузятся в память в процессе работы программ. Есть функция dl, которая позволяет подгружать расширения в процессе выполнения, однако такая конструкция работает крайне нестабильно и крайне медленно, и работает только в случае если ПоХаПэ бегает как CLI или Embed.
  • Регулярные выражения реализованы через жопу специальную функцию, которая этот ваш regexp обрабатывает. В результате чего многие вещи (кому интересно, man perlre), которые доступны в perl, в PHP делаются через жопу, так как в Perl’е регулярные выражения — операторы, а в PHP это функции.
  • Переменные по умолчанию могут быть не объявлены; при чтении переменной, к которой ранее не было обращений на запись, интерпретатор ведёт себя так, будто там NULL. Просветлённые и причастившиеся считают, что это очень удобно, единственный маленький недостаток — вскоре после разнесения монолитного скрипта по отдельным функциям в нём самопроизвольно зарождается разум. Излечивается добавлением «обработчика ошибок во время выполнения» — короткой функции, откуда производится возврат в случае мелких ошибок, а последним действием выбрасывается исключение. Без костылей это чудо вражеской техники не работает.
  • Отсутствует такая кошерная вещь, как CPAN в perl, которая позволяет огромному числу разработчиков по всему миру писать новые либы в составе комьюнити. Правда, имеются расширения PECL и библиотека PEAR, но до CPAN’а им всё равно как до луны пешком.
  • Всё-таки отсутствует многопоточность — потоков как таковых нет; curl_multi_exec позволяет лишь более-менее работать с множеством сетевых соединений одновременно. Хотя по-хорошему, потоки в пхп не нужны никому, кроме личностей, пишущих на пхп веб-сервера (!), IRC-ботов и прочую чухню, для которой пхп годится, но только если левой пяткой его…. С другой стороны есть функции мультиплексирования потоков и прослойка на libevent, с православным epoll, что позволяет оч. эффективно решать многие задачи в один поток/процесс.
  • Большие проблемы с реализацией utf-8. Что иногда лечится применением setlocale(). Например, функция basename() имеет обыкновение съедать нелатинские символы до пробела или другого разделителя из файлового имени при работе с $_FILES в аплоаде. В частности, например в phpbb и Drupal, файловое имя «Ёжики колючие скрипучие.png», превратится в «колючие скрипучие.png». Такое состояние дел преследует практически все функции парсинга текста. Исправить ситуацию можно указав локаль через setlocale(LC_ALL, 'ru_RU'). Дело потихоньку фиксится. Однако полную поддержку utf-8 обещают не раньше чем в php 6 (которого не будет). Более подробные описания данного явления можно найти на http://php.net в разделе документации basename().

[править] Заходите, люди добрые, берите, что хотите

  • Сайт (или, что ещё хуже, приложение) на PHP работает по принципу «в папке лежат файлы, выбирай любой». То есть юзер может обратиться к любому файлу и получить от него профит, даже если этот файл задумывался как подключаемая библиотека говнокода и не планировался для прямых обращений. Этот волшебный подход приводит как минимум к нескольким лулзам. Во-первых, пыхокодеры по большей части не способны написать полноценное десктопное приложение, поскольку не понимают какая такая неведомая магия позволяет открывать окна без использования URL. Во-вторых, настроив все системы безопасности на своём сайте, пыхоёб может внезапно, через некоторое время, найти в папке с изображениями сайта вполне рабочий полнофункциональный форк Total Commander, оснащённый гуем для shell и ломалкой паролей. Кстати, случай реальный.
  • Хочешь, режь, а хочешь, xуй, а PHP — это в первую очередь шаблонизатор. Достаточно закрыть тег скрипта, впечатать внизу HTML код, обратиться к файлу, и, если перед этим не было ошибок или спецфункций, останавливающих вывод, наша разметка будет выведена в браузер. Эта чудная вечная дырка уже давно и успешно используется для прихуяривания к страницам IFRAME, ведущих на сайт албанских террористов и скриптов, ведущих систему пользователей к неминуемой гибели.
  • Как ни странно, но ещё одним минусом пыхи являются пространства имён. Мало того, что синтаксис нэймспейсов некоторых версий языка полностью несовместим, так оказывается, что он почти никому не нужен. Разве что 1.5 теоретикам с хабра. Ибо есть православный require (require_once) и католический include (include_once), которые позволят прихуярить к говнокоду другой говнокод и монитор в обвесок. Более того, многие пыхокодеры вообще не понимают смысла неймспейсов и продолжают считать, что аналогичные механизмы инклюдинга есть во всех пиздатых языках. Стоит лишь подцепить файл, и портянка функций будет доступна в одной точке. ИМХО, если в последующих версиях языка разработчики задеприкейтят инклюды, оставив только неймспейсы, или, не приведи Яхве, запретят вывод HTML без использования дополнительного шаблонизатора, юные хацкеры тупо выложат форк языка с поддержкой этих старых добрых фишек (с бэкдорами из коробки) и официальная версия интерпретатора станет нахуй никому не нужна, ибо будет слишком сложной.
  • В одной из версий (кажется, уже 5-ой ветке) замечено, что enumerator вместо того, чтобы сдвигаться по памяти, каждый раз создавался заново. Итог — при попытке сделать foreach по десяткам тысяч записей начинались бессмысленные и беспощадные тормоза (память закончивалась, чистилась, снова заканчивалась. опять чистилась…). Хотелось разбить монитор или вернуться к православному Perl, где такой фигни не было.
  • Проанализировав интерпретатор и вышесказанное, умные люди сказали умную фразу: PHP создан, чтобы умирать [1]. Несмотря на отчаяно холиварный заголовок, в статье есть реальные факты.
  • В PHP7 "наконец-то" были добавлены тайпхинты (нет, это не статическая типизация и уж тем более не строгая).
  • В PHP8 "наконец-то" числа и строки стали нормально сравниваться, из-за чего стало меньше подобных лулзов
 $php = 0;
 var_dump($php == "хуита");  // печатало "bool(true)"

[править] Начинающие программисты на PHP

Более 9000 быдлокодеров каждый год начинают программировать на PHP. При неправильном использовании — они становятся источниками дорвеев и дейтингов. При правильном — источником лулзов. Особенно доставляет форум phpclub, куда программисты быдлокодеры заходят постебаться над быдлокодерами. Общаться с программистами PHP можно о чём угодно, кроме PHP. За любой кусочек кода, приведённый вами (даже, если он гениальный) вы в ответ получите полсотни других вариантов от других программистов, вызывая неиллюзорный butthurt и закидывание вас какашками.

То же самое произойдёт и при попытке найти работу. Sad but true.

[править] Опытные программисты и PHP

Веблансер.нет чуть менее, чем полностью состоит из быдлокодеров.

Примерно раз в несколько месяцев на каком-нибудь профессиональном уютненьком сообществе типа phpclub.ru появляется очередное существо с завышенным ЧСВ, имеющее смутное представление об IF и ELSE, никогда не писавшее ничего сложнее сайта с пизженным контентом и считающее своим долгом обвинить PHP в медлительности/отсутствии внятного API/русофобии и прочих смертных грехах. Вброс, как правило, начинается с утверждения, что правильные пацаны пишут сайты только на ASP.NET/Ruby/Python/Perl/C/Ассемблере и т. д. В адекватном сообществе подобные поциенты долго не задерживаются и быстро умываются собственным говном, особенно, если натыкаются на Фаната[5] (хотя в послнее время Фанат уже не тот и сам скатился в ЧСВшное говно).

Типичный пример унылого поста можно посмотреть в «Ссылках» («К вопросу об ублюдочности PHP»), или вот пример обсуждения:

Вопрос: Есть PHP скрипт, запускаемый из браузера, время выполнения - несколько часов. Минут через 20 после запуска в браузере вылетает 500 Internal Server Error, сам скрипт при этом продолжает работать, успешно все доделывает и не выполняется только последняя строчка (запись в лог-файл). Ответ 1: o_0. Может, в таком случае лучше не надо выполнять его в браузере? Ответ 2: подобные вопросы для PHP-публики редко актуальны :)

Взято с HashCode

Но существуют также разновидности тонкого троллинга на тему пригодности php как языка вообще:

В одном интервью с кем-то из руководителей Гугл спросили «Используете ли Вы и если да то как php в Гугл?». На что получили ответ «Да, используем… У нас в офисе есть страничка, через которую мы пиццу заказываем… Дак вот, ОНА написана на php.»

RSDN, SQL.ru и т. д.

Троли объёмные, но доставляющие каждой гранью, водятся в тех разделах имиджборд, куда Анонимус приходит поныть:

Алсо, упомянуть в диалоге программирование — лучший способ контрацепции. Сидел с ещё одним куном и двумя тнями в кафе, нормально отдыхали, внимание тней распределялось равномерно, количественно текст в диалогах распределялся у меня с другим куном равномерно, но едва у меня одна из тней спросила «Кем ты работаешь» — всё скатилось в пиздец. Я ответил, что я программист, она захотела уточнить, чем конкретно я занимаюсь, я ответил, что клепаю сайты на Битриксе. После чего на меня внимания больше не обращали. Я допил пиво, ушёл, никто не заметил.
(спойлер: ПИЗДЕЦ, БЛЯДЬ, ПИЗДЕЦ, ПОЧЕМУ БЛЯДЬ ВСЕ ТНИ НЕ ОДИНОКИЕ, КОМПЛЕКСУЮЩИЕ БЫДЛОКОДЕРШИ?!)

Доброчан, «Убежище»
Smile.svg Внимание!
Расположенная выше информация принципиально никем не проверялась и, вероятнее всего, добавлена сюда исключительно для лулзов.

[править] Пилите, Шура, пилите…

Пилите, Шура, они золотые! Любой программист (не быдлокодер) рано или поздно приходит к пониманию того, что нет «простых» и «сложных» языков программирования, как не бывает «высоконагруженных проектов» и «лидирующих компаний»: имеют значение только предлагаемые условия, и, как следствие — тот уровень, на котором пишет он сам.

К сожалению, область применения PHP такова, что в ней много простой работы, не требующей наличия моска, вроде допилить простейший скрипт и тому подобное. Настоящий программист никогда даже браться не будет за такой примитив, зато можно взять на работу школьника или макаку из зоопарка (что, впрочем, одно и то же). После двух дней изучения синтаксиса PHP, единственным правилом которого было и остаётся «одна перфокарта строка — одно действие», и школьник и макака могут делать эту работу — если, конечно, школьник не полный дебил.

Стоит ли удивляться, что при таком раскладе 90% программистов на PHP — сказочные долбоёбы, которые не могут нормально написать ни одной программы сложнее вывода на экран «Hello World»?

[править] PHP и ЕРЖ

Быдлокодер, пишущий на PHP, вполне может столкнуться с ошибкой вида: Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM. И медленно фалломорфировать, пытаясь понять, что это за PAAMAYIM NEKUDOTAYIM такой. А ларчик просто открывался: во всём опять виноваты… таки да! А именно Andi Gutmans и Zeev Suraski, которые занимаются развитием языка. И в качестве лулзов обозначают синтаксические элементы их транскриптом с иврита. В данном случае, PAAMAYIM NEKUDOTAYIM есть транскрипция жыдовского פעמיים נקודתיים‎, что означает «двойное двоеточие».

Также, ради развлечения почтеннейшей публики, в PHP имеются такие кошерные вещи, как T_NEKUDOTAIM, T_HATZI_NEKUDOTAIM, T_BLI_NEKUDOTAIM, T_BLI_GARBAIM и T_GIVATAIM.

Слава Б-гу!!!

[править] PHP как дурь

«Студент-второкурсник старшей школы Бретт Тайсон был отстранен от занятий, после того как учитель узнал, что Тайсон вероятно употребляет PHP.» «Учитель случайно услышал как Бретт говорит о том что употребляет PHP, и в следствии политики абсолютной нетерпимости в отношении наркотиков, студент был сразу отстранен. Без всяких вопросов.» — сообщил ректор Clyde Thurlow. «Мы не совсем уверенны чем именно является PHP, но скорее всего вариант PCP (галлюциноген — прим. пер. ), или новый синтетический наркотик, например как GHB (бутират — прим. пер.).»

http://habrahabr.ru/blogs/php/57000/, Оно же на мунспике.

Здравствуйте. Меня зовут Вячеслав, мне 22 года и я пхп программист. Я сижу на пхп с 18 лет. Первый раз я попробовал пхп с другом. Мы сидели, обсуждали веб-технологии и тут он сказал, что недавно пробовал пхп. Он предложил попробовать мне. Поначалу я не согласился, ведь это пхп, я слышал много плохих слухов про него, слышал, что он вызывает зависимость. Но друг настаивал, говорил, что в жизни нужно попробовать все и я сдался. Он предложил бесплатный скрипт, выводящий «Hello world!». Он казался совсем безобидным, но как потом оказалось, я уже не мог остановиться. Уже очень скоро благодаря пхп я попробовал свою первую cms. Это сейчас я понимаю, насколько опасным был этот шаг, но тогда я ничего не понимал, и мне это нравилось. Я не заметил, как после первой испробованной cms, мне уже захотелось написать свою. Дальше было только хуже. Я уже рискнул попробовать кое что потяжелее. Я решил попробовать свой первый фреймворк. Это было прекрасно. Но это была дорога в никуда. На тот момент родственники уже отчаялись мне помочь, а моя девушка узнав, что я использую пхп бросила меня. Я все больше отдалялся от своих друзей и родных, мое окружение составляли такие же пхп-программисты как и я. Мы собирались у одного в квартире, подключались к серверу и совместно программировали, используя пхп и фреймворки. Я попал в этот капкан пхп и теперь не могу самостоятельно избавиться от этого, моя жизнь сломана. Если бы мог вернуться в то время, я бы все исправил, и никогда не купился на эту уловку. Написано под воздействием тяжелой трудовой недели. Ребятам на вписке уже не хватает пхп и они пробуют питон и предлагают мне какие то аиограмы, я надеюсь, что до этого не дойдёт, но кажется некоторые уже пробуют го и руби от этого им почему то больно по началу, они кричат и зовут на помощь.

http://habrahabr.ru/post/142504/

[править] PHP как пиздец

Алсо, Пых может поломать жизнь не хуже любой дури, поэтому слушай, мой юный друг. Да, Пых — самый короткий и быстрый путь к баблу. Но если ты решил связать свою жизнь с программированием, то совет один: даже и не думай о Пыхе, иначе через пару лет будешь рвать волосы на жопе.

  • PHP впринципе никому нахуй не всрался.Ты никогда не будешь PHP-программистом,ну точнее взят именно на эту должность.Ты блядь станешь сразу всем,ну а зарплата...
  • Единственный + PHP кроме простоты написания это куча говнокода уже написанного на нём ранее.Серьёзно,никому даже на ум не придёт писать приложение без этого вашего фреймворка(96%),ебаного ORM который будет юзаться только чтобы ещё быстрее написать ёбаный сайт,кучи библиотек взятых с гитхаба.Все это конечно же будет скреплено автозагрузкой и прочими радостями позволяющими написать сайт ещё быстрее,но только ни слова про быстродействие и отладку этого говна...

Приложения на пыхе пишутся примерно так : 1 ) Вася пупкин сделал охуенный класс который позволяет упростить работу с массивами (- 5 строк кода + 1 секунда к интерпретации,как-то так...) 2 ) Петя его брат написал ещё более охуенную либу которая теперь так и вовсе позволяет работать с объектом PDO через ещё один класс его разработки (аплодисменты) и естесно добавляет в зависимости либу Васи (кстати 100 к 100 что её он юзает криво используя один из методов костылем к решению задачи которая решается другим методом,просто ридми на гитхабе надо было листать до конца) 3 ) Ещё прыщавому Андрюше достается охуенный заказ - за 4к российских ебануть инет-магазин к примеру цветов.Из всего что там не будет там не будет разве что круглосуточной трансляции как бабы впихивают себе цветы кое-куда,все остальное вместе с колл-бэк сервисами,онлайн-чатом на сайте там будет и включено в стоимость заказа. 4 ) Ясен хуй что произойдет дальше : Андрюша,вот только недавно прочитавший про охуенный,новый фреймворк ХУИМ,позволяющий ебашить на PHP ещё быстрее,при этом дрочя одной рукой,а другой массируя анал. 5 ) Андрюша понимает что в этом ебаном фреймворке нету нихуя кроме пары костылей,но времени всего 7 дней из которых 2 он уже проебал. 6 ) Андрюша делает на фреймворке сайт добавляя туда ПОЧТИ ORM Пети,какую-то ебаную либу для роутинга (вообще нахуй она сдалась не знает даже Онотоле) 7 ) До дэдлайна целый день,но у Андрюши проблемы : это все нихуя не работает по причине хуевого написания костылями. 8 ) Адская ебля...

  • PHP (вместе с Pascal) — самые низкооплачиваемые языки программирования. Сколько бы книг ты ни прочитал, сколько бы мегабайт кода ни написал, ты никогда не будешь получать больше, чем Java-быдлокодер средней криворукости. «На Яве пишут Корпорации», а на Пыхе…
  • Порог выхода такой же низкий, как и порог входа: если у программиста на полноценных языках с возрастом есть шанс стать ценным высокооплачиваемым специалистом, то у похапе-олдфага такой возможности нет просто ввиду убогости и примитивности решаемых задач, его спокойно можно выгнать на улицу, взяв взамен школьника, который обучится всем премудростям похапе-быдлокоддинга за пару месяцев, потребляя при этом в три раза меньше доширака.
  • Возможно, сейчас тебе кажется, что делать сайты — достойное и интересное занятие, но если ты хоть немного программист, через пару лет такой работы ты просто завоешь от того, насколько это унылая и далекая от программирования деятельность.
  • Большинство проектов кроме того, что по сути своей убоги, представляют из себя чудовищный говнокод на кривых самодельных говнофреймворках и говноCMS (потому как сам язык не только не заставляет писать правильно, но и фактически подталкивает к производству быдловелосипедов). Как следствие такой работы — необратимое поражение мозга и окончательная потеря квалификации. Чему также способствует работа в коллективе невероятно тупых похапешников, постоянные оскорбления и обвинения (просто потому, что умный человек PHP не выберет).
  • Некоторые начинают работать на PHP с надеждой потом перейти на что-нибудь другое. Но это тоже большая ошибка: во-первых, теряется драгоценное время для старта (наверное, самое важное и ценное в и без того короткой профессиональной жизни программиста), а во-вторых, PHP-опыт никому не нужен и нормальные программисты справедливо смотрят на него как на говно. «PHP» — клеймо быдлокодера на лбу и крест на карьере профессионального программиста, если ты пошёл по этому пути, назад дороги уже не будет. Единственное исключение — устроится похапешником на многопрофильную фирму, где тебя каким-то чудом заметят и предложат перейти на полноценную технологию, но это невероятная удача.
  • Чуть более, чем вся относительно хорошо оплачиваемая работа для похапешников состоит из поддержки ботнетов, порносайтов, говносайтов с вирусами и прочего подобного дерьма. Подумай, хочешь ли ты потратить свою жизнь на засирание интернетов.

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

Ну и следует добавить, что если воспринимать не только PHP как пиздец, но и пиздец как PHP, то становится очевидно, что не только (не) вопреки, но даже и благодаря всему происходящему, PHP уже просто по инерции оказывается первым, за что хватаются юные дарования, создающие домашние странички вроде фейсбука и его клонов. «Раз все пишут, то и я напишу». Ибо стопицот миллионов леммингов не могут оши… throw new Exception();

[править] Алсо

  • PHP (или P.H.P.) — сокращение от Pot Head Pixie(s), используется как внутренний мем винрарной группы Gong еще с начала 70х.
  • PHP — международное обозначение филиппинского песо (ну как доллар USD, графическое — ₱)
  • PHP — Prvi Hrvatski Pistolj, "Первый Хорватский Пистолет", был в спешном порядке разработан в отделившейся от союзной Югославии Хорватии в начале девяностых годов 20 века.

[править] Ссылки

  • http://www.php.net/ — официальный сайт.
  • http://www.php.ru/ — уютненькое русскоязычное сообщество.
  • http://www.php.su/ — учебник на русском языке.
  • http://www.phpclub.ru/ — русское комьюнити.
  • Причины стремительного успеха PHP — PHP-фаг о том как его язык зохавал моски быдлокодеров.
  • Фрактал плохого дизайна — эпичный пост про недостатки ПоХаПе, перевод этой статьи. И молоток с гвоздодёрами с двух сторон — тоже оттуда (альтернативный вариант молотка).
  • Бесконечно плохой дизайн — более годный перевод той же статьи
  • Livejournal user icon.png«К вопросу об ублюдочности PHP»/107170. Автор данного опуса — священный воин Джихада. Это клинический пример лютой, бешеной ненависти к конкретному объекту во Вселенной, просто потому что сиё предписано.
    • http://nuclight.livejournal.com/107170.html?thread=403618#t403618 — Что типичные PHP-программисты думают о других языках.
  • http://lj.tfolder.ru/auto02/IMG_2292~tumbochka.JPG — тумбочка на PHP.
  • http://www.xakep.ru/post/59267/default.asp — PHP: создан быдлокодерами для быдлокодеров.
  • http://www.govnokod.ru/php?page=393 — канонічные творения на PHP.
  • https://webshake.ru/php-training-course - бесплатный онлайн-курс по правильному PHP.

[править] См. также

  • Быдлокодер
  • Интернеты
  • Perl

Защита от прямого вызова

Как правило код располагается в нескольких php-файлах. Подключение обычное — либо require(), либо через автозагрузку классов, но суть в том, что в итоге код оказывается в нескольких файлах.

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

По задумке разработчика вызываться для исполнения должен только a.php, но любой посторонний посетитель может вызвать b.phpпрямо из браузера. Если этот файл принимает данные, скажем из POST/GET-запроса, то нет никаких сложностей его передать напрямую в исполняемый код.

Чтобы защититься от прямого вызова php-файла используется несколько подходов.

Первый — защита на уровне сервера.

Например переместить все php-файлы из public_htmlв каталог выше. Таким образом посетители в принципе не смогут получить к ним доступ. Другой способ — использование .htaccessв каталоге php-файлов с директивой Deny from all. Работает идентично, только проще для использования.

Второй способ — защита на уровне PHP. Здесь мы не полагаемся на сервер, а встраиваем защиту в каждый php-файл.

В первом файле задаётся произвольная константа MYSCRIPT, а во всех подключаемых файлах, проверяется её существование. Таким образом, при прямом вызове php-файла скрипт завершит работу с сообщением «No direct script access allowed». И уже не важно, будет ли в файле какая-то потенциальная брешь в безопасности или нет. Выполнить код получится только в одном случае — через первый файл.

Где можно не делать такую защиту

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

Первый — если файл состоит только из объявлений функций, но не использует их.

Если сделать прямой вызов такого файла, то ничего не произойдёт, поскольку в файле нет реального выполнения функций. А вот если файл состоит из объявления функций и их вызовов, то такой файл уже нужно защищать. То есть вот так делать не следует:

Второй случай — это файл php-класса. Как правило они содержат только объявление класса, но не его использование. Поэтому прямой вызов файла, так же ни к чему не приведёт.

Третий случай — если это «return-файл». Такой вариант часто встречается для конфигурационных файлов:

 'Bill'	
];

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

Вывод ошибок

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

Когда вы скрываете вывод ошибок, то создаёте несколько проблем.

  • Вы элементарно не знаете, что сайт работает с ошибкой и это часто приводит к проблемам вывода html-кода, тормозам сервера и т.д.
  • Чтобы найти эту ошибку нужно как минимум посмотреть логи на сервере. Стоит ли говорить, что у многих он просто отключен?

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

Получение данных от пользователя

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

Условно можно поделить все такие задачи на две группы. Первая — это получение данных и формирование единственной реакции на неё. И вторая — получение и сохранение этих данных, например в базе.

«Быстрая» реакция

Например пользователь заполняет форму, скрипт на сервере её получает и формируется email-письмо, которое приходит вам. В данном случае полученные данные нигде не сохраняются, а значит, если предположить существование уязвимости, то проблемой может быть:

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

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

Валидация данных

Чтобы предотвратить подобные атаки используется валидация данных. Например мы точно знаем, что нужен email-адрес. Если он указан в некорректном формате, значит никакой отправки почты и быть не может. Поэтому мы должны проверить адрес:

Валидация нужна для проверки email, адреса сайта, допустимые символы имени пользователя, пароля и т.д. Это критичные данные и если они некорректные, то нужно сообщить пользователю, что они ошибочные. При этом, естественно, основная работа скрипта (отправка письма) выполнена не будет.

Фильтрация данных

В некоторых случаях данные можно отфильтровать. Например в имени пользователя используются крайние пробелы. Возможно они были нажаты по ошибке, а значит данные можно пропустить через trim()и тем самым получить корректные данные.

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

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

То есть там, где можно исправить ввод пользователя — это делается через фильтрацию.

Валидация данных на входе

Сейчас HTML 5 предлагает множество готовых вариантов ввода данных (тэг INPUT). Поэтому нужно их использовать. Это позволяет уже на этапе ввода и отправки данных, передать задачу валидации браузеру.

Конечно же это рассчитано на добросовестных пользователей и не отменяет проверок на уровне сервера.

Сохранение данных пользователя

Здесь похожая схема — нужно проверить данные перед тем, как отправлять её в базу данных. Но возникает ещё одна проблема: SQL-инъекции — когда злоумышленник пытается подобрать SQL-запрос во входящих данных так, чтобы он был выполнен в теле основного SQL-запроса.

Поэтому перед тем, как что-то добавлять в базу, нужен этап валидации и фильтрации. А уже после этого необходимо обеспечить корректное добавление данных. Поскольку в основном используется MySQL, то данные необходимо пропускать через функцию mysqli_real_escape_string(), которая выполняет экранирование специальных символов так, чтобы они не повлияли на основной SQL-запрос.

Важный момент — экранирование символов нужно только для защиты от SQL-инъекции, но это не отменяет тот факт, что вредоносный код может быть всё равно добавлен в базу, поскольку представляет собой обычный текст. Именно поэтому и нужна начальная фильтрация данных.

Другой способ — использовать PDO::prepare. Сейчас многие используют PDO, поэтому такой способ более предпочтительный.

Вывод данных

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

То есть никто не может гарантировать, что в базе данных не окажется потенциально опасный код. При этом, вполне возможно, что пользователь всего лишь хотел показать пример на JavaScript. Как поступать в этих случаях?

Решается это на этапе вывода данных. Общий смысл в том, что вывод также нужно обрабатывать.

Например, если данные выводятся в поле INPUT, то его необходимо пропускать через htmlspecialchars()

Такой подход позволит сразу обнаружить проблемную зону. Но, что делать, если данные на самом деле состоят из html-тэгов?

Здесь используется функция strip_tags(), которая удаляет все тэги, кроме разрешённых.

echo strip_tags($text, '
');

Таким образом, хоть в данных и будет вредоносный код, на сайте он не будет выведен.

XSS-фильтрация

На самом деле это достаточно сложная штука, которая требует хороших знаний. Суть XSS-атаки в том, что на сайт внедряется js-код, который может получить что-то от пользователя. Например текущую куку, а значит есть риск «угона» доступа к сайту. Или встречается js/html-код, который выводит рекламу злоумышленника.

Решение состоит в том, чтобы пропускать текст для вывода через специальную функцию, которая умеет находить опасные куски кода и сигнализирует об этом. Например в MaxSite CMS используются функции CodeIgniter.

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

$textXSS = myFilterXSS($text); // функция возвращает отфильтрованный текст
 
if ($text != $textXSS) {
	// возможно опасное содержимое
	...
}

Например в форме отправки вы точно знаете, что нельзя применять тэг SCRIPT. Значит в своей myFilterXSS()можно проверить наличие этого тэга и если он есть, то блокировать отправку почты. Другой способ — прогнать входящий текст через strip_tags()и если там будут запрещённые тэги, то также блокировать отправку. Таким образом почта будет отправлена только с корректными данными.

С базой данных делается аналогично: вначале проверка, потом действие.

Множество форм - одна цель

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

То, насколько регулярно и активно используются формы обратной связи на Вашем сайте, расскажет о Вашем сайте не хуже аналитики посещений.

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

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

Форм обратной связи может быть великое множество («Заказать обратный звонок», «Задать вопрос», «Оставить отзыв», «Заполнить форму заказа», «Обратиться к руководителю» и т. д.), и использоваться они могут для разных задач. Но цель у всех будет в сущности одна - обеспечить связь посетителя сайта и его администратора или владельца, получить контакты посетителя для дальнейшего взаимодействия с ним.

Семь подсказок на заметку

Вспомним несколько простых правил, которые нужно учитывать при разработке и размещении ФОС на сайте.

    Форма должна располагаться так, чтобы посетителю было удобно ее найти.

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

    Традиционно формы можно разместить в хедере сайта или на странице контактов.

    Можно при необходимости продублировать в футере ключевые формы, чтобы не заставлять посетителей, просмотревших всю страницу, пролистывать ее снова вверх:

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

    Кроме того, это позволит «зацепить» посетителя, который уже заинтересован в продукте или услуге. Посетитель посмотрел описание, гарантии, цены, решил, что продукт или услуга ему подходят и вот, мы ему сразу предлагаем, не уходя с этой страницы, оставить заявку на заказ этой услуги.

    Форма должна отображаться и работать одинаково корректно на всех устройствах и во всех браузерах.

    Или кратко – проверьте кроссбраузерность и кроссплатформенность форм обратной связи на вашем сайте. Форма может быть заметной и удобной для заполнения с ноутбука или стационарного компьютера, но на планшете поле для ввода данных может оказаться слишком узким и неудобным для внесения в него текста с сенсорного экрана. Будет ли тогда клиент раз за разом пытаться внести свои данные, чтобы связаться с вами? Ответ очевиден.

    Форма должна быть краткой и понятной.

    Что это значит? Форма не должна состоять из большого количества полей или этапов заполнения. Если, конечно, в этом нет жесткой необходимости. Люди стремятся к простоте, они не хотят тратить много времени на то, чтобы разобраться и заполнить десять тысяч полей.

    Если услуга подразумевает получение довольно подробной информации, упростите задачу клиенту (если это, конечно, возможно). Выделите несколько ключевых полей, которые нужно заполнить:

    Выглядит более удобно, чем, например:

    Лучше перезвонить и устно уточнить все, что вам нужно, но облегчить посетителю заполнение формы. И повысить тем самым шансы на то, что он к вам обратиться!

    Продолжая тему понятности, обратите внимание на то, чтобы у формы был заголовок – «Заказать обратный звонок», «Заказ вызова замерщика», «Заказ бесплатной консультации» и т.д. Этот же заголовок лучше дублировать в электронных оповещениях, которые будут приходить с формы на вашу почту. Тогда не только посетитель вашего сайта не запутается и не забудет заявку, на что именно он оформляет. Но и вы сами получите четкие данные, какая именно информация интересовала посетителя, оставившего заявку. Это поможет быстро сориентироваться при дальнейшем общении с посетителем и корректно построить диалог.

    Форма должна обладать приятным и практичным дизайном.

    Все поля должны быть хорошо видны. Если при создании дизайна формы используется много цветов, стоит обратить внимание на то, чтобы их не было слишком много, чтобы они сочетались и не были чрезмерно яркими. Человек, заполняющий форму, не должен напрягать зрение. То же самое относится к подбору цвета для текстовых сообщений.

    Лучше избегать сочетания темного на темном. Если, например, на темно-синем фоне вы сделаете темно-красную или темно-зеленую надпись «Ваше сообщение отправлено», его просто не будет видно.

    Форма должна содержать призыв к действию.

    Небольшой штрих, призывающий посетителя совершить или завершить действие. В нашем случае отправить сообщение с сайта!

    Также кнопку лучше выделить контрастным цветом. Вместе с призывом к действию, это сделает ее заметной, и привлечет внимание посетителя.

    Форма должна легко сворачиваться.

    Итак, форму легко найти, она обладает приятным дизайном, удобна для заполнения. Что еще?

    Не забудьте попросить разработчиков добавить «крестик» на форму, чтобы можно было ее закрыть. Или настроить автоматическое сворачивание формы после ее заполнения.

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

    Настройка ответного сообщения.

    Как-то вот так…

    Человек, отправивший сообщение, хочет быть уверен, что его сообщение будет получено вами и рассмотрено. Технически настройка автоматического оповещения много времени не отнимет, зато укрепит уверенность посетителя в том, что его сообщение не останется без ответа. Обычно это используется в тех формах, где при заполнении требуется указать свою электронную почту. Впрочем, современные сервисы позволяют настраивать автоматические оповещения и через SMS.

Подводя итог

Тонкостей и прочих деталей очень много: можно экспериментировать с формой и дизайном, можно дорисовать ненавязчивую графику по теме и т.д. Но базовые критерии не меняются. Ко всему сказанному выше хочется добавить большое, но немаловажное пожелание – периодически проверяйте работу форм обратной связи на сайте. Технические сбои не должны быть препятствие в работе вашего бизнеса!

Добрый день, друзья! В этой статье я расскажу, с помощью php и ajax. Настроить и установить форму обратной связи без перезагрузки на Ваш сайт. А так же я записал подробный видео урок по этой теме.

На самом деле, мне регулярно приходят сообщения с просьбами рассказать, как создать форму обратной связи без перезагрузки , как сделать форму подписки без перезагрузки , как настроить такую форму на сайте и ещё очень много подобных вопросов.

Сразу скажу, что это довольно сложная тема сама по себе, а рассказать нужно так, чтобы её смогли понять и усвоить и те люди, которые совсем не разбираются в программировании на PHP и JavaScript (ajax). Эта статья не для новичков, и если Вы плохо разбираетесь в HTML и совсем не знаете PHP, то разобраться Вам будет трудновато.

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

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

Нажимая кнопку «Отправить» вверху над формой обратной связи появится подсказка «Сообщение обрабатывается…»

Если посетитель Вашего сайта не заполнил форму или ввёл не корректные данные, то появится сообщение об ошибке.

Если же всё было заполнено верно, то текст из формы обратной связи отправится на Ваш e-mail, а человеку будет показано сообщение об успешной отправке.

Ну а теперь друзья переходим к коду.
HTML-код формы обратной связи без перезагрузки будет выглядеть так:

Задать новый вопрос:

HTML- это скелет нашей формы. Давайте её немного украсим, добавив CSS-стилей:

SidebarForm { background: #f6f6f6; box-shadow: 0 0 5px #ccc; -webkit-box-shadow: 0 0 5px #ccc; -moz-box-shadow: 0 0 5px #ccc; width: 420px; } #cor5 { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; } .sidebarForm h4 { font: 14px Verdana; color: #333333; text-align: left; padding: 10px 10px 0 10px; } .sidebarForm label { font: 12px Verdana; color: #333; padding: 10px; } .sidebarForm .input { width: 170px; height: 20px; overflow: hidden; background: white; border: solid 1px #DFE2E5; margin: 5px 0 10px 10px; box-shadow: 0 0 5px #ccc; -webkit-box-shadow: 0 0 5px #ccc; -moz-box-shadow: 0 0 5px #ccc; } .sidebarForm .input input { width: 165px; height: 26px; background: white; margin: -3px 0 0 -5px; padding: 0px 8px; border: none; background: transparent; } .sidebarForm .textarea { height: 70px; width: 320px; overflow: hidden; background: white; border: solid 1px #DFE2E5; margin: 5px 0 10px 10px; box-shadow: 0 0 5px #ccc; -webkit-box-shadow: 0 0 5px #ccc; -moz-box-shadow: 0 0 5px #ccc; } .sidebarForm .textarea textarea { width: 316px; height: 66px; background: white; border: none; resize:none; } .sidebarForm button { border: 2px #ccc solid; width: 150px; height: 25px; font: 12px Verdana; font-weight: 700; color: #FFFFFF; background-color: #cc0000; padding-bottom: 2px; margin: 5px 0 15px 135px; }

Информация из нашей формы обратной связи после нажатия на кнопку «Отправить», отправляется на сервер (в обработчик) в фоновом режиме, без перезагрузки страницы в браузере. За это отвечает JavaScript-код:

$(document).ready(function() { // Форма обратной связи................................./ var regVr22 = "

Сообщение обрабатывается...

"; $("#send").click(function(){ $("#loadBar").html(regVr22).show(); var posName = $("#posName").val(); var posEmail = $("#posEmail").val(); var posText = $("#posText").val(); $.ajax({ type: "POST", url: "../send.php", data: {"posName": posName, "posEmail": posEmail, "posText": posText}, cache: false, success: function(response){ var messageResp = "

Спасибо, "; var resultStat = "! Ваше сообщение отправлено!

"; var oll = (messageResp + posName + resultStat); if(response == 1){ $("#loadBar").html(oll).fadeIn(3000); $("#posName").val(""); $("#posEmail").val(""); $("#posText").val(""); } else { $("#loadBar").html(response).fadeIn(3000); } } }); return false; }); });

В обработчике нам необходимо проверить что отправил посетитель, и если всё в порядке отправить письмо админу сайта. А посетителю сообщить, что его письмо успешно отправлено! Пишем php-код:

header("Content-type: text/html; charset=utf-8"); //********************************************** if(empty($_POST["js"])){ $log ==""; $error="no"; //флаг наличия ошибки $posName = addslashes($_POST["posName"]); $posName = htmlspecialchars($posName); $posName = stripslashes($posName); $posName = trim($posName); $posEmail = addslashes($_POST["posEmail"]); $posEmail = htmlspecialchars($posEmail); $posEmail = stripslashes($posEmail); $posEmail = trim($posEmail); $posText = addslashes($_POST["posText"]); $posText = htmlspecialchars($posText); $posText = stripslashes($posText); $posText = trim($posText); //Проверка правильность имени if(!$posName || strlen($posName)>20 || strlen($posName) Неправильно заполнено поле \"Ваше имя\" (3-15 символов)!"; $error="yes"; } //Проверка email адреса function isEmail($posEmail) { return(preg_match("/^[-_.[:alnum:]][email protected]((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|((?|||)\.){3}(?|||))$/i" ,$posEmail)); } if($posEmail == "") { $log .= "

  • Пожалуйста, введите Ваш email!
  • "; $error = "yes"; } else if(!isEmail($posEmail)) { $log .= "

  • Вы ввели неправильный e-mail. Пожалуйста, исправьте его!
  • "; $error = "yes"; } //Проверка наличия введенного текста комментария if (empty($posText)) { $log .= "

  • Необходимо указать текст сообщения!
  • "; $error = "yes"; } //Проверка длины текста комментария if(strlen($posText)>1010) { $log .= "

  • Слишком длинный текст, в вашем распоряжении 1000 символов!
  • "; $error = "yes"; } //Проверка на наличие длинных слов $mas = preg_split("/[\s]+/",$posText); foreach($mas as $index => $val) { if (strlen($val)>60) { $log .= "

  • Слишком длинные слова (более 60 символов) в тексте записи!
  • "; $error = "yes"; break; } } sleep(2); //Если нет ошибок отправляем email if($error=="no") { //Отправка письма админу о новом комментарии $to = "[email protected]";//Ваш e-mail адрес $mes = "Человек по имени $posName отправил Вам сообщение из формы обратной связи Вашего сайта: \n\n$posText"; $from = $posEmail; $sub = "=?utf-8?B?".base64_encode("Новое сообщение с Вашего сайта")."?="; $headers = "From: ".$from." "; $headers .= "MIME-Version: 1.0 "; $headers .= "Content-type: text/plain; charset=utf-8 "; mail($to, $sub, $mes, $headers); echo "1"; //Всё Ok! } else//если ошибки есть { echo "

    Ошибка!

    "; //Нельзя отправлять пустые сообщения } }

    В коде представлены необходимые комментарии и пояснения. Более подробно я рассказываю в видео ниже.

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

    Как Вам статья? Надеюсь, тема: «Как создать форму обратной связи без перезагрузки страницы » была Вам интересна, и Вы нашли здесь для себя что-то полезное. Не забудьте подписаться на обновление моего сайта по e-mail.
    Внимание! Всех приглашаю в свою

    Привет ребята. На связи Серёга. Знаю, что давно не писал - дела, дела... Да и сейчас, если честно, времени совсем нету. И форму будем делать не по моему уроку, а по урокам моего знакомого - Кротова Романа .

    Создавать форму обратной связи для сайта мы будем последовательно. Поэтому эта статья будет разбита на 3 урока.

    Мы просто заведём её в HTML и создадим PHP-обработчик для отправки писем. Всё будет последовательно, с нуля и до результата. Так, что бы вы всё поняли, и смогли самостоятельно встроить нужные поля.

    Рома, покажет Вам как сделать Ajax-загрузку. То есть отправлять данные с формы без перезагрузки странички. Что, согласитесь, весьма удобно и современно.

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

    Видео 1. Создание формы обратной связи для сайта.

    Обращаю внимание! Что бы форма заработала - необходимо, что бы ваш хостинг поддерживал PHP.

    Если у вас возникнут вопросы касательно непонятных моментов в написании обработчика формы для отправки писем - не стесняйтесь, задавайте их в комментариях.

    Код из урока по созданию формы обратной связи

    Вот что получилось в итоге в файле index.php

    Напоминаю, что в нём содержится простенькая форма обратной связи . Без оформления и прочих прибамбасов. Что бы не нагружать Вас лишней информацией.

    Содержимое файла submit.php:

    Здесь осуществляется базовая проверка формы на заполненность, что бы не отправлять пустые сообщения. Если всё "гуд" - письмо отправляется. И идёт переадресация на страницу-уведомление об успешном отправлении письма.

    If (!empty($_POST["name"]) AND !empty($_POST["email"]) AND !empty($_POST["message"])) { $headers = "From: Кротов Роман " . "Reply-To: [email protected] " . "X-Mailer: PHP/" . phpversion(); $theme = "Новое сообщение с сайта"; $letter = "Данные сообщения:"; $letter .=" "; $letter .="Имя: ".$_POST["name"]; $letter .=" Email: ".$_POST["email"]; $letter .=" Телефон: ".$_POST["phone"]; $letter .=" Сообщение: ".$_POST["message"]; if (mail("[email protected]", $theme, $letter, $headers)){ header("Location: /testform/thankyou.php"); } else { header("Location: /testform"); } } else { header("Location: /testform"); }

    Ну а саму страницу уведомление не вижу смысла здесь размещать. Там базовая структура HTML-документа и всего одна строчка текста.

    Создание формы обратной связи

    Создание формы обратной связи на сайте

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

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

    Рис.1. Простая форма обратной связи

    Для размещения на сайте такой формы обратной связи достаточно всего лишь элементарных сведений об HTML и умения оперировать двумя командами - Копировать и Вставить. Рассмотрим последовательность действий по созданию формы обратной связи (рис.1) на HTML-странице сайта.

    1. Проверьте, что тарифный план вашего хостинга (контора, где размещён ваш сайт) поддерживает PHP. Если нет, то вам придётся скорее всего доплатить для перехода на другой тариф, поддерживающий эту самую PHP. Значение этой аббревиатуры можете не искать, так как знание PHP вам не понадобится.

    2. Выберем страницу, на которой хотим разместить форму обратной связи, и вставим в нужное место следующий код:

    Как видим, вся форма создаётся тегом с атрибутами action=mail.php (указание на страницу сайта, где расположен сценарий обработки введенных данных) и method=post (метод отправки данных на сервер). Отдельные строки созданы тегом с вполне понятными атрибутами. Расположение отдельных элементов формы, текст, шрифты и проч. можете менять в соответствие с дизайном вашего сайта. В теге задаются размеры области для ввода текста сообщения: число строк и колонок (rows="3" cols="25").

    3. Создадим новую страницу mail.php , аналогичную обычной HTML, только имеющую расширение.php. Полный код страницы показан на рис.2:



    Обратная связь

    if (isset($_POST["name"])) {$name = $_POST["name"];}
    if (isset($_POST["email"])) {$email = $_POST["email"];}
    if (isset($_POST["mess"])) {$mess = $_POST["mess"];}

    $to = "pupkin@rambler.ru "; /*Укажите ваш адрес электоронной почты*/
    $headers = "Content-type: text/plain; charset=utf-8";
    $subject = "Сообщение с вашего сайта";
    $message = "Имя пославшего: $name \nЭлектронный адрес: $email \nСообщение: $mess";
    $send = mail ($to, $subject, $message, $headers);
    if ($send == "true")
    {
    echo "Спасибо за отправку вашего сообщения!

    ";
    echo " Нажмите, чтобы вернуться на главную страницу";
    }
    else
    {
    echo "

    Ошибка. Сообщение не отправлено!";
    }
    ?>

    Рис.2. Код страницы обработки формы обратной связи

    Красным цветом выделены адреса ссылок, на которые необходимо обратить внимание:

    • pupkin@rambler.ru - адрес г.Пупкина заменить на адрес вашей почты, куда будут поступать сообщения от посетителей сайта, а также от неутомимых спамеров. Кстати, для защиты от них в форму часто вводят так называемую капчу (англ. CAPTCHA - Completely Automated Public Turing test to tell Computers and Humans Apart - полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей). Обычно это сильно искаженные цифры и буквы, которые просят ввести перед отправкой сообщения. О капче поговорим в одной из следующих статей.
      Если вы хотите отправлять письма на несколько адресов, то просто перечислите их через запятую.
    • a href=index.html - адрес главной (домашней) страницы сайта.

    Созданную страницу mail.php необходимо поместить в тот же каталог сайта (директорию, папку), где расположена и страница с формой обратной связи.

    Проверьте работоспособность формы обратной связи. Если всё сделано аккуратно, то после заполнения формы и нажатия Отправить сообщение должен появиться следующий текст: "Спасибо за отправку вашего сообщения. , чтобы вернуться на главную страницу ". После этого вы обнаружите в своём почтовом ящике (или другом, который вы указали при создании формы обратной связи) собственное послание себе любимому.

    Замечание: на некоторых хостингах новая (только что установленная на сайте) форма обратной связи начинает работать не сразу, и первые письма не доходят совсем или поступают с задержкой на 1-2 дня. Вероятно, идет "притирка шестеренок", а затем все работает нормально. Кроме того, с некоторых хостингов не доходят письма на определенные адреса, например, у меня были проблемы с ящиком на Рамблере и Mail.ru. Для решения этих проблем обратитесь к вашему хостеру - обычно помогают.

    Иногда при использовании описанной формы обратной связи возникают проблемы с кодировкой. Если в пришедшем письме вместо родной кириллицы текст состоит из "кракозяблов" или пустых квадратиков, то приходится вручную подбирать кодировку, что конечно же неудобно. Чтобы этого не происходило, проверьте, что ваша страница с формой обратной связи имеет кодировку charset=utf-8 . Если вы используете программу Adobe Dreamweaver , то для этого надо выбрать раздел меню Изменить - Свойства страницы - Кодировка .

    Подробнее проблема с кодировкой файлов сайта рассмотрена в статье Проблемы с кодировкой в форме обратной связи .

    В описанном примере для простоты сообщение об отправке письма выводится на пустой странице. Конечно, вы можете разместить его на любой странице своего сайта, чтобы посетитель мог использовать навигацию (меню) для выбора дальнейших действий. Для этого поместите РНР-код (то, что расположено от ?php до ?> ) в нужное место страницы с меню и измените её название на mail.php.

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

    Инструкция по созданию формы обратной связи на HTML и CSS, а также сборник готовых форм и руководство по их подключению и настройке.

    Навигация

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

    Однако далеко не каждый готовый шаблон способен удовлетворить требования пользователя. Многие из них представлены в «сыром» виде и не имеют таких важных разделов и функций как, например, форма обратной связи.

    Данный блок сайта крайне важен для владельцев интернет-магазинов и крупных информационных порталов. В нашей статье Вы найдёте информацию о том, как самостоятельно создать форму обратной связи, где скачать готовый шаблон и как установить его на свой сайт.

    Рисунок 1. Что такое форма обратной связи и почему она так необходима?

    Что такое форма обратной связи и почему она так необходима?

    • Одной из наиболее важных функций любого приличного сайта является форма обратной связи. Она служит для взаимодействия между посетителем и администрацией ресурса. Так с её помощью можно написать обращение в техническую поддержку или отправить необходимые администрации данные. Например, платёжные реквизиты в интернет-магазинах или наименование заказываемого товара. Иметь такую форму на своём портале настоятельно рекомендуется, так как постоянный контакт со своими посетителями и клиентами – залог его успешного развития.

    Форма обратной связи представляет собой отдельную страницу или блок (отдел), состоящий из нескольких полей ввода текста и кнопки «Отправить». Как правило, стандартная форма имеет следующие поля:

    Как создать простейшую форму обратной связи для сайта на HTML и PHP?

    Чтобы не превратить статью в полноценный занудный учебник, мы будем исходить из того, что Вы уже знакомы с азами языка разметки HTML и имеете общее представление о том, как он работает. Если у Вас нет таких навыков то, прежде чем браться за создание формы, настоятельно рекомендуется немного подтянуть свои знания на бесплатном ресурсе htmlbook.ru . Иначе Вы можете не только забросить эту затею, но и испортить код уже имеющегося у Вас сайта.

    Для воссоздания рабочей формы обратной связи Вам потребуется три важных элемента, один из которых отвечает за разметку и структуру формы (HTML ), второй за её внешнее оформление (CSS ), а третий за обработку и передачу данных (PHP ). Начнём по порядку:

    Написание HTML-кода для формы обратной связи

    • Шаг 1 . Для того, чтобы обозначить форму в HTML используется тэг . Внутри него будут задаваться размеры, стили и другие жизненно важные свойства формы. При записи самого тэга ему необходимо задать для обозначения класс, который в дальнейшем поможет установить для формы CSS стили.

    • Шаг 2 . Далее для создания первого поля нашей формы внутри тэга необходимо написать блочный тэг

      , которой отвечает за создание новой строки.

    • Шаг 3 . Внутри тэга

      с новой строки вписываем следующий тэг: Имя . Он отвечает за наименования будущего поля формы.

    • Шаг 4 . С новой строки всё в том же тэге

      прописываем тэг создания поля со следующими значениями: Введите ваше имя» required \> . Параметр «type=»text «» задаёт тип текстового поля, а параметр «placeholder=» Введите ваше имя«» задаёт начальный текст в этом самом текстовом поле. Параметр «required » даёт понять посетителю сайта, что данное поле обязательно для заполнения. В результате у Вас должна получиться форма с одним полем, как показано на скриншоте ниже.

    • Шаг 5 . По выше приведённому примеру добавьте остальные нужные Вам поля, каждый раз начиная с тега

      . Для установки поля с текстовым сообщением используйте тэг . Параметры «cols » и «rows » отвечают за ширину и высоту текстового поля. Можете задать параметры, какие Вам больше нравятся. У Вас должно получиться примерно так, как показано на скриншоте ниже.

    • Шаг 6 . Чтобы защитить себя от ботов, которых сегодня в интернете довольно много, создайте ещё одну строку с помощью тэга . За счёт параметра «style=»display:none» » данное поле не будет видно простым смертным, однако ботами будет заполняться автоматически. Таким образом, Вы всегда сможете отличить живого человека от программы.

    • Шаг 7 . Завершающим этапом разметки станет создание кнопки отправки. Для этого используется тэг . Создайте новый блок

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

    Работа с каскадными таблицами стилей (CSS)

    • Как Вы уже успели заметить в процессе разметки, у нас получилось что-то очень кривое, невзрачное и отвратительное. Для того, чтобы придать форме обратной связи более или менее опрятный вид, одного языка HTML будет недостаточно. Для этой цели придётся прибегнуть к использованию стилей CSS .
    • В том случае, если Вы воспользовались советом подтянуть свои базовые навыки на ресурсе htmlbook.ru , то задать определённые параметры оформления для всех частей формы с помощью CSS Вам не составит никакого труда. Если же у Вас нет желания или времени со всем этим возиться, то мы предоставим Вам уже готовый код и расскажем, как его подключить.

    Подключить стили CSS к HTML можно двумя способами:

    • Скопируйте код из нашего файла каскадных таблиц в самый низ файла style.css , который присутствует на хостинге сайта
    • Переместите наш файл стилей к себе на хостинг и подключите его

    Файл style.css подключается внутри тэга с помощью скрипта . В том случае, если файл со стилями лежит не в той же самой папке, что и основной файл html, то к нему необходимо указать путь. В нашем файле со стилями каждый элемент имеет обозначение. При желании Вы сможете поменять параметры под себя, руководствуясь только базовыми навыками программирования.

    Подключение файла PHP и его настройка

    Как уже было сказано ранее, скрипт PHP отвечает за исполнение формы обратной связи. Однако для того, чтобы более или менее понять принцип работы языка PHP , необходимо прочитать большой объём литературы и провести приличное количество часов за практикой. Поэтому, как и в случае с CSS , мы предоставим Вам уже готовый файл с php-скриптом, который останется только прикрепить к документу с формой.

    В отличие от файла style.css , файл с php-скриптом прикрепляется в свойствах самой формы. Начнём по порядку:

    • Шаг 1 . Откройте ранее написанный код и найдите строку с открытым тегом формы. Добавьте к нему свойства «action=»contact-form.php» » и «method=»post» ». Смотрите пример на скриншоте.

    • Шаг 2 . Скачайте наш php-файл и поместите его на хостинг в ту же папку, где находится html-документ с формой. Таким образом, php и html файлы будут взаимодействовать между собой.

    • Шаг 3 . Далее необходимо настроить скрипт под себя. Откройте файл и задайте переменные, присваивая им те же имена, что и в скрипте html. Если Вы добавляли в форму дополнительные поля, допишите их в скрипте php точно так, как показано на скриншоте.

    • Шаг 4 . Далее необходимо добавить ещё две переменных с адресом вашей электронной почты и темой письма, которая будет отображаться на вашем ящике. В строке с переменной «$address » укажите E-mail, а в строке «$sub » тему письма как показано на скриншоте.
    • Шаг 5 . В строке с переменной «$mes » настраивается формат письма, которое Вы получите на почту. Вы можете переписать его без изменений или отредактировать по собственному вкусу.

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

    После выполнения всех действий на выходе Вы получите вот такую простенькую опрятную форму обратной связи

    Подборка красивых дизайнерских форм обратной связи на HTML и CSS для разных целей

    • Опираясь на выше приведённые инструкции, Вы без труда сможете «нарисовать» форму обратной связи под свой собственный вкус. Однако, если у Вас нет времени или желания самостоятельно создавать форму с нуля, Вы можете найти в интернете уже готовые дизайнерские формы и обладая базовыми навыками HTML отредактировать их под себя.

    • Немного поискав, мы нашли для Вас подборку из 35 красивых всплывающих дизайнерских форм обратной связи, которые написаны на HTML и CSS . Данные формы подходят для таких движков, как WordPress и Joomla , имеют простую и лёгкую настройку из панели управления, а также прекрасно подходят для сайтов без движка.

    Языки Сценариев

    PHP (аббревиатура от Hypertext Preprocessor) является одним из языков сценариев, наряду с JavaScript и Python. Разница между этими языками заключается в том, что PHP в основном используется для коммуникации на стороне сервера, в то время как JavaScript может использоваться как для фронтенд, так и бэкенд-разработки. Python используется исключительно для написания бэкенда.

    Звучит слишком сложно? Вот почему, прежде чем углубляться в PHP, следует разобраться, что такое языки сценариев. 

    Язык сценариев — это язык, который автоматизирует выполнение задач в специальной среде. Язык сценариев, как бы указывает статической странице (написанной на HTML и CSS) выполнять определённые действия по заданным вами правилам.

    Например, вы можете использовать скрипт валидации формы, чтобы убедиться, что все поля были заполнены перед отправкой формы на сервер. Сценарий запускается и проверяет все поля, как только пользователь нажимает кнопку “Отправить”.

    Если какое-то из обязательных полей не было заполнено, пользователь увидит соответствующее предупреждающее сообщение. 

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

    Фронтенд и Бэкенд

    Языки сценариев могут работать как на стороне клиента (фронтенд), так и на стороне сервера (бэкенд).

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

    С другой стороны, язык серверных сценариев означает, что сценарии выполняются на серверах до их отправки в браузеры. Поэтому вместо отправки исходного кода веб-серверы сначала обрабатывают (анализируют) код, превращая его в простой HTML-формат.

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

    Теперь, когда вы понимаете основной концепт языков сценариев, давайте вернёмся к главному вопросу…

    Что Такое PHP?

    Как упоминалось ранее, PHP — это язык сценариев, созданный для коммуникации на бэкенде. Следовательно, он может обрабатывать различные функции на стороне сервера, такие как сбор данных формы, управление файлами на сервере, изменение баз данных и многое другое.

    PHP был создан Расмусом Лердорфом для отслеживания посетителей на его личной домашней странице. Когда язык стал довольно популярным, Лердорф наконец выпустил его как проект с открытым исходным кодом. Многие разработчики стали использовать, исправлять и улучшать код, что в конечном итоге превратило его в язык сценариев, который мы используем сегодня.

    Хотя PHP считается скриптовым языком общего назначения, наиболее широко он используется в веб-разработке (англ). Это обусловлено одной из его выдающихся особенностей — возможностью встраивания в файл HTML.

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

    Ещё одно преимущество этой функции заключается в том, что вам не придётся переписывать HTML снова и снова при повторном использовании. Просто напишите код в файле PHP и всякий раз, когда вам нужно использовать HTML, вставляйте этот файл. 

    Пример PHP-страницы можно увидеть на Facebook. Откройте домашнюю страницу соцсети, и вы увидите, что её URL заканчивается на .php (facebook.com/home.php). Это значит, что страница построена с помощью файла PHP (home.php), который содержит смесь PHP и тегов HTML.

    Если вы хотите узнать больше о том, как пишется файл PHP, взгляните на простой пример:

     PHP TestПривет из Hostinger'; ?> 
     
    
    

    Если вы поместите этот PHP-файл в корневой каталог вашего сайта, вы найдёте его, перейдя по адресу vashsite.com/privet.php

    Вывод этого PHP-файла в HTML будет выглядеть следующим образом:

     PHP Test

    Привет из Hostinger

    Это самый простой пример, так как вам даже не нужно каким-либо образом запускать этот скрипт. Мы просто использовали команду echo, чтобы сказать странице отображать Привет из Hostinger. Этот пример, однако, показывает, как ваш сайт может интерпретировать код PHP в HTML.

    Почему PHP?

    PHP — не единственный язык сценариев для работы на стороне сервера. Тем не менее, если вы запускаете сайт на WordPress, у PHP здесь нет конкурентов.

    WordPress написан на PHP. Поэтому, если вы знаете этот язык, вы можете настроить ваш сайт как угодно. Во-первых, это даёт вам возможность редактировать существующие плагины (англ) и темы (англ), а во-вторых вы можете создать собственный плагин или тему с нуля. Если вы хотите стать WordPress-разработчиком, учите PHP.

    Если вы всё ещё сомневаетесь, вот ещё несколько аргументов в пользу этого языка:

    • Невысокий порог вхождения. Язык легко учить, так как он имеет отличную документацию с примерами, описывающую функции.
    • Широко используется для разработки совершенно разных платформ, например, интернет-магазинов, блогов, социальных сетей и так далее. Согласно статистике 79% всех сайтов (англ) используют PHP!
    • Низкая стоимость. PHP — это проект с открытым исходным кодом, поэтому вы можете использовать его бесплатно.
    • Большое сообщество. Если у вас возникнут какие-либо проблемы, вам не о чем беспокоиться, потому что в Интернете вы найдёте много профильных блогов, форумов и т.д.
    • Интегрируется с базами данных — MySQL, Oracle, Sybase, DB2 и другими.

    PHP vs JavaScript

    Мы уже упоминали, что PHP имеет широкое применение. Тем не менее, наиболее часто он используется для создания динамического контента.

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

    Почему нам нужны оба?

    На самом деле, чтобы создать динамический сайт, хватит одного JavaScript. Однако функциональность будет сильно отличаться.

    С помощью JavaScript вы можете создать динамический сайт с простыми эффектами, такими как ховер, автозамена, фотогалереи. Но у вас не получится написать сайт, позволяющий пользователям генерировать собственный контент, например, социальную сеть, интернет-магазин (создание заказа, регистрация вход и другие виды взаимодействий с сайтом). Без PHP не обойтись.

    Допустим, вы входите в социальную сеть. Чтобы отобразить информацию в профиле, PHP извлекает ваши данные из базы данных и отправляет результат в браузер.

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

    Следовательно, JavaScript и PHP не являются конкурентами. Они дополняют друг друга.

    1. Общие положения

    1.1. В настоящем Соглашении применяются следующие термины и определения:

    Платформа — совокупность Сервисов и иной информации, содержащейся в информационных системах Администрации, доступ к которым обеспечивается посредством сети «Интернет» по сетевому адресу в следующих доменах (включая поддомены): https://htmlacademy.ru.

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

    Личный кабинет — совокупность защищённых техническими средствами страниц Платформы, представляющих собой персональный раздел Пользователя на Платформе, к которому Пользователь получает доступ после прохождения регистрации и/или авторизации на Платформе. Личный кабинет предназначен для заключения, исполнения, прекращения, гражданско-правовых сделок с Администрацией, использования дополнительных функциональных возможностей Платформы, просмотра и управления доступными функциональными возможностями Платформы, получения скидок на Сервис, направления в адрес Администрации сообщений, уведомлений, а также осуществления иных действий, предусмотренных явными функциями Личного кабинета.

    1.2. В настоящем Соглашении могут быть использованы иные термины и определения, не указанные в п. 1.1. Соглашения. В этом случае толкование такого термина производится в соответствии с текстом Соглашения. В случае отсутствия однозначного толкования термина или определения в тексте Соглашения, следует руководствоваться его толкованием, определённым, в первую очередь, — договором между Администрацией и Пользователем, и в последующем — нормами применимого права.

    1.3. Администрация предоставляет Пользователю право использования отдельными Сервисами Платформы в пределах, установленных настоящим Соглашением и иными договорами. Право использования Сервисов Платформы предоставляется на условиях простой (неисключительной) лицензии. Администрация вправе устанавливать дополнительные или иные условия использования отдельных Сервисов. В случае если договором на использование отдельного Сервиса установлены условия использования, отличные от условий, указанных в настоящем Соглашении, Администрация и Пользователь будут руководствоваться договором на использование соответствующего Сервиса.

    1.4.Любое использование Пользователем Платформы, в том числе, но не ограничиваясь следующими способами: посещение Платформы, заполнение регистрационных форм, направление заявок и обращений Администрации, создание Личного кабинета, использование бесплатных и платных Сервисов, — является акцептом Пользователем условий, изложенных в настоящем Соглашении и создаёт договор в соответствии с положениями ст. 437 и 438 Гражданского кодекса Российской Федерации.

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

    a. Ознакомился с условиями настоящего Соглашения в полном объёме;

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

    в. Соглашение может быть изменено Администрацией без какого-либо специального уведомления Пользователя. Новая редакция Соглашения и/или указанных в нём обязательных документов вступает в силу с момента размещения на Платформе либо доведения до сведения Пользователя в иной удобной форме, если иное не предусмотрено новой редакцией Соглашения. Пользователь обязуется при каждом посещении Платформы проверять актуальную редакцию Соглашения и в случае, если не согласен с каким-либо условием, прекратить использование Платформы. Действующая редакция Соглашения находится по адресу https://htmlacademy.ru/docs/agreement.

    1.6. Пользователь обязуется соблюдать следующие условия и ограничения использования Платформы и Сервисов:

    а. Для использования Платформы и Сервисов Пользователь обязуется своими силами и за свой счёт обеспечить себя компьютером, иным необходимым Пользователю оборудованием, необходимым для использования Платформы и Сервисов;

    б. Для использования Платформы и Сервисов Пользователь обязуется своими силами и за свой счёт обеспечить подключение своего компьютера к сети Интернет, обеспечивающей достаточную скорость и качество связи (интернет-соединения);

    в. Для использования Платформы и Сервисов Пользователь обязуется своими силами и за свой счёт обеспечить установку на свой компьютер последней версией интернет-браузера, иного программного обеспечения, необходимого для использования Платформы и Сервисов, произвести своими силами настройку установленного программного обеспечения, в том числе отключить всё программные средства, препятствующие работе Платформы и Сервисов;

    г. Пользователь не вправе использовать Платформу и Сервисы, если это прямо запрещено применимым правом, судебным актом, актом органа исполнительной власти;

    д. Если для использования Сервиса требуется регистрация Пользователя и создание Личного кабинета, заключение отдельного договора, совершение иных действий — Пользователь должен самостоятельно осуществить регистрацию и создание Личного кабинета, заключить договор с Администрацией, совершить иные предусмотренные действия. В случае если Пользователь не согласен использовать Сервис при соблюдении представленных на Платформе условий, Пользователь не вправе предпринимать попытки использовать Сервис или требовать от Администрации предоставления Сервиса на иных условиях.

    е. Пользователь обязуется обеспечить конфиденциальность и безопасность учётных данных от Личного кабинета.

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

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

    и. Пользователь при использовании Платформы и Сервисов обязуется соблюдать действующее законодательство Российской Федерации, а также иных стран, если оно применимо к отношениям, связанным с использованием Платформы и Сервисов.

    з. Пользователь не вправе нарушать права и законные интересы Администрации, работников Администрации, других пользователей.

    и. Пользователь не вправе использовать Платформу и Сервисы в целях незаконного распространения контрафактной продукции, нарушения исключительных прав Администрации и любых иных лиц.

    к. Пользователю запрещается копировать, модифицировать, изменять, удалять, дополнять, публиковать, передавать содержащиеся на Платформе результаты интеллектуальной деятельности, создавать производные работы, изготавливать или продавать товары/оказывать услуги на их основе, воспроизводить, отображать или любым другим образом эксплуатировать или использовать такие результаты интеллектуальной деятельности без прямого разрешения Администрации. При цитировании, если цитирование допускается в силу закона или отдельного договора между Пользователем и Администрацией, Пользователь обязуется указывать ссылку на Платформу.

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

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

    н. Пользователь не вправе использовать Платформу, Сервисы и их элементы для получения любой материальной выгоды, осуществления коммерческой деятельности, извлечения прибыли, для использования любым противоречащим закону способом;

    о. Пользователь не вправе копировать программный код, дизайн Платформы и Сервисов, создавать копии Сервисов, Платформы;

    п. Пользователь не вправе размещать на Платформе персональные данные третьих лиц, изображения и фотографии третьих лиц;

    р. Пользователь не вправе использовать на Платформе адреса электронной почты третьих лиц, банковские карты и иные средства платежа третьих лиц, если от них не было заранее получено надлежащим образом оформленное согласие;

    с. Пользователь не вправе продавать свой Личный кабинет или делать его предметом иных сделок;

    т. Пользователь не вправе размещать на Платформе рекламу, оферты о продаже товаров, работ, услуг, информацию политического, агитационного характера;

    у. Пользователь не вправе размещать на Платформе информацию, распространение которой каким-либо образом запрещено или ограничено в Российской Федерации;

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

    х. Пользователь не вправе размещать на Платформе информацию, порочащую честь, деловую репутацию, достоинство Администрации, а также любого третьего лица;

    ц. Пользователь обязуется в срок, не превышающий 1 (один) час с момента направления Администрацией обращения в адрес Пользователя прекратить любое нарушение настоящего Соглашения и (или) иного договора, заключённого между Пользователем и Администрацией;

    ч. Пользователь обязуется в срок, не превышающий 24 (двадцать четыре) часа с момента направления Администрацией требования предоставить ответ на запрос, затрагивающий вопрос соблюдения Пользователем Соглашения и иных договоров.

    2. Регистрация Пользователя и использование Платформы

    2.1. Использование полных функциональных возможностей Платформы, включая использование Сервисов, допускается только после прохождения Пользователем регистрации и авторизации на Платформе в соответствии с установленной Администрацией процедурой.

    2.2. Перечень функциональных возможностей Платформы, использование которых требует предварительной регистрации и/или авторизации, а также принятия в необходимых случаях дополнительных документов на использование Сервисов, определяется по единоличному усмотрению Администрации и может время от времени изменяться. Администрация доводит до Пользователя информацию о необходимости регистрации и (или) авторизации непосредственно на Платформе, без публикации отдельных списков и перечней. Администрация вправе в одностороннем порядке изменить условия использования Сервисов, установив или отменив условие об обязательной регистрации и (или) авторизации для доступа к Сервису.

    2.3. По завершении процедуры регистрации создаётся уникальная учётная запись, связанная с Личным кабинетом Пользователя на Платформе, которая необходима для использования большинства функциональных возможностей Платформы и Сервисов.

    2.4. Для регистрации Пользователь обязуется предоставить достоверную и полную информацию по вопросам, предлагаемым в форме регистрации, и поддерживать эту информацию в актуальном состоянии. Если Пользователь предоставляет неверную информацию или у Администрации есть основания полагать, что предоставленная Пользователем информация неполна или недостоверна, Администрация имеет право по своему усмотрению заблокировать или удалить учётную запись Пользователя, а также отказать Пользователю в использовании Платформы и Сервисов полностью или в определённой части.

    2.5. Любые действия, совершённые из-под учётной записи Пользователя, считаются совершёнными соответствующим Пользователем. В случае несанкционированного доступа к учётной записи Пользователя, или распространения доступа, Пользователь обязан незамедлительно сообщить об этом Администрации.

    2.6. Администрация оставляет за собой право в любой момент потребовать от Пользователя подтверждения информации, указанной при регистрации, либо в Личном кабинете, а также запросить в связи с этим подтверждающие документы, непредоставление которых, по усмотрению Администрации, может быть приравнено к предоставлению недостоверной информации и повлечь последствия, предусмотренные п. 2.4. Соглашения. В случае если данные Пользователя, указанные в предоставленных им документах, не соответствуют данным, указанным при регистрации, а также в случае, когда данные, указанные при регистрации, не позволяют идентифицировать пользователя, Администрация вправе применить меры, указанные в п. 2.4. Соглашения.

    2.7. Информация, содержащаяся в Личном кабинете, обрабатывается Администрацией в соответствии с Политикой обработки персональных данных https://htmlacademy.ru/docs/privacy.

    2.8. Пользователь выражает своё согласие на получения от Администрации информации, рекламы, предложений, на указанные Пользователем при регистрации на Платформе и (или) в Личном кабинете, адреса электронной почты, номера телефонов, в том через мессенджеры, короткие SMS-сообщения, телефонные и интернет-звонки с использованием сети Интернет, по сети подвижной радиотелефонной связи и иным способом.

    Администрация вправе использовать адреса электронной почты, номера телефонов Пользователя и другие данные Пользователя, указанные Пользователем при регистрации на Платформе, в Личном кабинете, при использовании Платформы и Сервисов, для отправки Пользователю информации, рекламы, предложений Исполнителя на адреса электронной почты, через мессенджеры, короткие SMS-сообщения, посредством телефонных звонков и интернет-звонков с использованием сети Интернет, по сети подвижной связи и иным способом.

    2.9. Пользователь обязуется использовать Платформу и Сервисы только в законных целях, способами, установленными Соглашением и отдельными договорами на использование Сервисов.

    2.10. Пользователь обязуется соблюдать условия и ограничения использования Платформы и Сервисов, установленные в п. 1.6. Соглашения, иными договорами между Пользователем и Администрацией.

    2.11. Пользователь несёт единоличную полную ответственность в случае нарушения условий использования Платформы и Сервисов.

    2.12. В случае, если Администрация понесёт убытки в результате нарушения Пользователем Соглашения, Пользователь обязуется компенсировать Администрации убытки в полном объёме.

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

    2.14. Администрация вправе устанавливать лимиты по объёму и составу размещаемых Пользователем информационных материалов, а также вводить иные технические ограничения использования Платформы, которые время от времени будут доводиться до сведения Пользователей способом, определяемым Администрацией по своему усмотрению.

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

    3. Ответственность и гарантии

    3.1. Администрация не несёт ответственности за нарушение условий настоящего Соглашения, если такое нарушение вызвано действием обстоятельств непреодолимой силы (форс-мажор), включая: действия и акты органов государственной власти, должностных лиц, в том числе судебные акты, запретительные акты органов исполнительной власти, пожар, наводнение, землетрясение, другие стихийные действия, эпидемии, пандемии, отсутствие электроэнергии и/или сбои работы компьютерной сети (нарушение работы линий связи, неисправность оборудования и т. п.), приостановка работы сервисов, обслуживающих Платформу, забастовки, гражданские волнения, беспорядки, любые иные обстоятельства, не ограничиваясь перечисленным, которые могут повлиять на выполнение Администрацией условий настоящего Соглашения.

    3.2. Администрация не несёт ответственности за неисполнение или ненадлежащее исполнение обязательств по Соглашению, а также возможные убытки, возникшие в том числе, но не ограничиваясь, в результате:

    а. Неправомерных действий третьих лиц, направленных на нарушения информационной безопасности или нормального функционирования Платформы;

    б. Сбоев в работе Платформы, вызванных ошибками в коде, компьютерными вирусами и иными посторонними фрагментами кода в программном обеспечении Платформы;

    в. Отсутствия (невозможности установления, прекращения и пр.) интернет-соединений между сервером Пользователя и сервером Платформы;

    г. Проведения государственными и муниципальными органами оперативно-розыскных мероприятий, контрольно-надзорных, проверочных мероприятий;

    д. Установления государственного регулирования (или регулирования иными организациями) хозяйственной деятельности коммерческих организаций в сети Интернет и/или установления указанными субъектами разовых ограничений, затрудняющих или делающих невозможным исполнение Соглашения или его части;

    е. Других случаев, связанных с действиями/бездействием третьих лиц, направленными на ухудшение общей ситуации с использованием сети Интернет и/или компьютерного оборудования, существовавшей на момент заключения Соглашения;

    ж. Выполнения Администрацией профилактических работ на Платформе.

    3.3. Все споры, вытекающие из правоотношений по настоящему Соглашению, разрешаются путём переговоров. В случае, если Стороны не придут к решению возникших между ними споров в ходе переговоров, такие споры должны быть переданы на рассмотрение в соответствующий суд Российской Федерации по месту нахождения Администрации с обязательным соблюдением претензионного порядка. Срок ответа на претензию составляет 2 (два) месяца с даты получения претензии. Претензия должна направляться в адрес Администрации по адресу, указанному в Едином государственном реестр юридических лиц.

    3.4. Бездействие со стороны Администрации в случае нарушения Пользователем либо иными Пользователями положений Соглашений не лишает Администрации права предпринять соответствующие действия в защиту своих интересов позднее, а также не означает отказ Администрации от своих прав в случае совершения в последующем подобных либо сходных нарушений.

    4. Интеллектуальная собственность

    4.1. Содержимое Платформы, в том числе, но не ограничиваясь: подбор и расположением материалов, программный код Платформы, элементы дизайна, являются результатами интеллектуальной деятельности, исключительное право на которые в полном объеме принадлежит Администрации. Отдельные результаты интеллектуальной деятельности, размещённые на Платформе, используются Администрацией на основании лицензионного соглашения между Администрацией и правообладателем.

    Исключительное право на вышеуказанные результаты интеллектуальной деятельности не переходят к Пользователю в результате пользования Платформы и заключения Соглашения.

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

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

    4.3. Пользователь обязуется соблюдать следующие запреты и ограничения в отношении использования шрифта TT Norms Pro, используемого на Платформе:

    4.3.1. Исключительное право на шрифт TT Norms Pro (далее — Шрифт) принадлежит ООО «ТАЙПТАЙП» ИНН 7814193820 (далее — Правообладатель шрифта). Право использования Шрифта предоставлено Правообладателем шрифта Администрации на основании простой (неисключительной) лицензии.

    4.3.2. Пользователь не получает право использовать файлы Шрифта.

    4.3.3. В случае если Пользователь получил изображения и (или) документы, в которые встроены символы Шрифта, Пользователь не вправе редактировать Шрифт, изображения и (или) документы, в которые встроены Шрифт, а также обходить защиту в отношении таких изображений и (или) документов.

    4.3.4. Пользователь не вправе использовать изображения Шрифта за пределами Платформы.

    4.3.5. Пользователи, не заключившие лицензионное соглашение с Правообладателем шрифта, не могут вводить в гражданский оборот товары, работы или услуги, содержащие Шрифт.

    4.3.6. В случае необходимости использования Шрифта Пользователь обязуется обратиться к Правообладателю шрифта для заключения лицензионного договора.

    5. Персональные данные и их обработка

    5.1. Цель, условия, порядок и иные условия обработки персональных данных Пользователя определены Политикой обработки персональных данных, доступной по адресу https://htmlacademy.ru/docs/privacy.