Статьи

PHP 101

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

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

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

Шаг первый — HTML. Понять, для чего служит <div> . Узнайте, как структурировать контент, используя семантические теги. Создайте простую веб-страницу без стилей.

Шаг второй, как вы уже догадались, это CSS. Узнайте, как стилизовать элементы на странице. Оцените, что означает «разделение интересов» и как это относится к вашим HTML и CSS. Завершите свой первый простой сайт.

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

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

Для целей этой статьи давайте предположим, что вы выбрали последний вариант; на стороне сервера, это так!

Нельзя отрицать тот факт, что PHP доминирует в сети.

К сожалению, еще раз, вы сталкиваетесь с горсткой путей, по которым нужно идти. Стоит ли выбирать самый популярный вариант — PHP? Как насчет Руби? Крутые детки, кажется, предпочитают это в наши дни. Опять же, что если у вас есть борода? Является ли Python правильным выбором? Но самое главное, как вы могли бы сделать выбор, когда у вас нет опыта?

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

Хотя это правда, что PHP не самый красивый из языков, нельзя отрицать тот факт, что он доминирует в Интернете. На самом деле, это самый популярный язык сценариев в мире. Преимущество этого заключается в том, что вы можете быть уверены, что каждый вопрос PHP уже был задан, решен и задокументирован. Там комфортно знать это. Несмотря на то, что вы находитесь на самой хрупкой стадии вашего обучения, у вашего порога огромное дружелюбное сообщество, готовое помочь. Более того, PHP переживает современный ренессанс, как никогда раньше, благодаря таким инструментам, как Composer и Laravel.


PHP, сокращение от PHP: Hypertext Preprocessor (да, разработчики любят их рекурсивные шутки), это язык сценариев, который был создан специально для Интернета. Впрочем, высоки шансы, что для вас это еще ничего не значит. Язык сценариев? А? Когда бы вы достигли PHP поверх простого HTML? Ну, может быть, пример в порядке. Предполагая, что вы успешно установили PHP, создайте файл index.php в новой папке на вашем рабочем столе и добавьте:

1
2
3
<?php
 
echo ‘Hello world’;

Да, это вездесущий пример » Привет, мир «, с которым вы хорошо познакомитесь по мере развития ваших навыков. У каждого языка / фреймворка / инструмента есть один!

Чтобы запустить этот код, используйте встроенный сервер PHP. Переключитесь на ваш любимый инструмент командной строки (Terminal, для пользователей Mac), cd в папку проекта и загрузите сервер с php -S localhost:8888 . Эта команда переводится как « Запустить сервер и сделать его доступным из моего браузера по адресу localhost, порт 8888.» Идите и попробуйте! Откройте Google Chrome, перейдите на localhost:8888 , и вы увидите « Hello world *» на странице! Острота! echo — это языковая конструкция, которая не делает ничего, кроме вывода заданного значения.

Совет: MAMP и WAMP — это отличные решения в один клик для установки PHP, MySQL и Apache на ваш Mac или ПК без необходимости ввязываться в командную строку. Они могут быть полезным выбором на ранних этапах вашего обучения.

WampServer — это среда разработки, которая позволяет одним щелчком мыши установить PHP, Apache и MySQL.

По общему признанию, это не самая захватывающая вещь в мире. На самом деле, вы, вероятно, думаете про себя: « Почему я не могу написать« Hello world »прямо на HTML-страницу и полностью исключить необходимость в PHP? » Это правда; для этого примера это не имеет смысла. Однако язык сценариев, такой как PHP, становится особенно полезным, когда выходные данные должны быть динамическими по своей природе. Что, если вместо world вы хотите, чтобы приветствие ссылалось на значение, переданное через строку запроса URL-адреса (текст в адресной строке, следующий за знаком вопроса). Вот обновленный пример, который выполняет только это!

1
2
3
<?php
 
echo ‘Hello, ‘ .

Ах, это вводит несколько новых методов. Во-первых, один период, который отделяет строку Hello и запутывает $_GET позволяет объединять (или группировать) значения. В этом случае мы хотим вывести « Hello, *», а затем значение, представленное $_GET['person'] . Это то, что мы называем суперглобальным массивом. Для простоты представьте, что это способ * получить значение из строки запроса URL-адреса.

Проверьте это, загрузив localhost:8888/?person=Joe . Если настроено правильно, веб-страница должна теперь отображать « Привет, Джо ». Поиграйте с ним, заменив Joe своим именем. Обратите внимание, как выходные данные обновляются при каждом обновлении страницы? Это просто было бы невозможно со статическим HTML.

Одним из ключей к зрелому программированию является рассмотрение каждого возможного пути через ваш код. Например, что если никакой person ключ недоступен? Возможно, строка запроса была опущена полностью. В этом случае, безусловно, будет выдано сообщение об ошибке, поскольку ключ пользователя не будет существовать. Какое решение? Хотя это правда, что это не более чем простой пример, все же важно учитывать все возможные результаты. Давайте предоставим дефолт.

1
2
3
4
5
6
7
8
9
<?php
 
if (isset($_GET[‘person’])) {
    $person = $_GET[‘person’];
} else {
    $person = ‘Joe’;
}
 
echo ‘Hello, ‘ .

Хотя для этого есть более обтекаемые способы, приведенный выше пример является отличной отправной точкой. Это также ваше первое знакомство с условными утверждениями. Подходите к своему коду так же, как к сценариям в реальной жизни. Например, « Если у нас кончилось молоко, тогда иди в магазин. В противном случае оставайся дома». Это мышление можно перевести на PHP, используя следующую логику:

1
2
3
4
5
6
7
$outOfMilk = true;
 
if ($outOfMilk) {
    echo ‘Going out to the store.’;
} else {
    echo ‘Breakfast is served.’
}

В этом фрагменте кода на экран выводится только одна строка текста. Значение переменной (динамическое значение), $outOfMilk , будет определять поток управления.

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

Возвращаясь к предыдущему примеру, пока установлено $_GET['person'] (представьте себе псевдо-имя для «is available»), затем создайте новую переменную $person равную ее значению. В противном случае примените значение по умолчанию. Если вы вернетесь в браузер, он теперь должен работать правильно, независимо от того, существует ли ключ person в строке запроса.

К сожалению, мы все еще не свободны. Ключевой практикой программирования является обеспечение безопасности на переднем крае каждого действия. Даже с этим невероятно простым примером мы открыли дверь к одной из самых распространенных проблем безопасности в Интернете: XSS (межсайтовый скриптинг). Истинное понимание этого абсолютно выходит за рамки этого вводного урока (однако на нем написаны целые книги), но вот основная иллюстрация: что если $_GET['person'] равно, не строка, а скрипт?

1
http://localhost:8888/?person=<script>alert(‘ATTACK!’)</script>

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

Браузеры на основе Webkit (например, Chrome и Safari) теперь обеспечивают защиту от подобных атак. Тем не менее, это не всегда так, и все еще не в Firefox и Internet Explorer.

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

1
2
3
4
5
6
7
8
9
<?php
 
if (isset($_GET[‘person’])) {
    $person = $_GET[‘person’];
} else {
    $person = ‘Joe’;
}
 
echo ‘Hello, ‘ .

С этой модификацией, если кто-то предпримет попытку XSS-атаки, мы будем готовы! htmlspecialchars — это встроенная функция PHP, которая переводит различные символы в их элементы. & становится &amp; < становится &lt; и т.д. Это делает его идеальным инструментом для обеспечения дополнительной безопасности. <script> имеет смысла, если он преобразован в &lt;script&gt; перед тем, как быть казненным. Пользователь просто увидит:

1
Hello, <script>alert(‘ATTACK!’)</script>

Большой; без вреда!


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

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

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

Первым шагом является определение новой функции, которая называется isAdult . Функции могут принимать внешний ввод, который затем можно использовать. Это позволяет возвращаемым данным из функции быть динамическими. В этом случае, чтобы определить, является ли человек взрослым, нам нужно знать год его рождения. Последний шаг — вернуть значение true или false , в зависимости от того, равен ли текущий год минус двадцать один год.

1
2
3
4
5
function isAdult($yob) {
    $currentYear = 2013;
 
    return $currentYear — $yob >= 21;
}

Это действительно довольно просто! Теперь нам нужно только передать его вышибалу. Функция может быть вызвана или вызвана путем ссылки на ее имя, за которым следует набор скобок: isAdult() . Однако если функция требует аргумент, вы можете указать его в скобках, как показано ниже:

1
2
3
4
5
if (isAdult(1985)) {
    echo ‘Come on in!’;
} else {
    echo ‘Please leave now, before I call your mother.’;
}

Есть одна isAdult проблема с этой функцией isAdult . Текущий год был жестко запрограммирован. Конечно, это будет работать в течение 2013 года, но как насчет следующего года? Похоже, что это значение тоже должно быть динамическим. PHP предоставляет функцию date , которую можно использовать для вычисления текущего года. Таким образом, функция может быть обновлена ​​до:

1
2
3
4
5
function isAdult($yob) {
    $currentYear = date(‘Y’);
 
    return $currentYear — $yob >= 21;
}

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

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

Массив в последней версии PHP (5.4) можно определить, используя разделенный запятыми список в скобках, например:

1
$group = [1985, 1990, 1992, 1997];

Эта переменная $group теперь содержит несколько дат рождения. Доступ к значениям внутри него можно получить, указав индекс, например, $group[0] . Массивы — это то, что мы называем нулями. В переводе это означает, что первый элемент или ключ в массиве будет иметь нулевой индекс. Таким образом, для доступа к значению 1992 года вы должны ссылаться на $group[2] .

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

1
2
3
4
5
6
7
8
$group = [1985, 1990, 1992, 1997];
foreach($group as $yob) {
    if (isAdult($yob)) {
        echo ‘Come on in!’;
    } else {
        echo ‘Please leave now, before I call your mother.’;
    }
}

Обратите внимание, как вышибала объявляет, что год рождения foreach человека в group должен содержаться в переменной $yob . Затем, как и прежде, он передает это значение в функцию isAdult и выполняет соответствующие действия.

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

1
2
3
4
5
6
$group = [
    ‘John’ => 1985,
    ‘Susan’ => 1990,
    ‘Joe’ => 1992,
    ‘Sara’ => 1997
];

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
$group = [
    ‘John’ => 1985,
    ‘Susan’ => 1990,
    ‘Joe’ => 1992,
    ‘Sara’ => 1997
];
 
foreach($group as $name => $yob) {
    if (isAdult($yob)) {
        echo «Come on in, $name!»;
    } else {
        echo «Please leave now, $name, before I call your mother.»;
    }
}

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


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

01
02
03
04
05
06
07
08
09
10
class Person {
    public $name;
    public $age;
 
    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

Обратите внимание, что __construct() ? Это называется магическим методом и будет запущено сразу после создания экземпляра. Когда этот метод срабатывает, он примет имя и возраст, а затем присоединит его к объекту.

Чтобы использовать этот класс, попробуйте:

1
$me = new Person(‘Jeffrey’, 28);

Это создаст новый экземпляр класса Person . Этот экземпляр, который хранится в переменной $me , может называться объектом. Теперь ничто не мешает вам создавать несколько экземпляров этого класса — и, фактически, в реальных проектах вы это сделаете! Класс это просто план.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
class Person {
    public $name;
    public $age;
    public $spouse;
 
    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
 
    public function marry(Person $spouse)
    {
        $this->spouse = $spouse;
    }
}
 
$me = new Person(‘Jeff’, 28);
$her = new Person(‘Allison’, 28);
$me->marry($her);

Этот измененный код теперь включает метод marry() , который обновит свойство $spouse объекта. Теперь у вас есть прямая связь между двумя людьми.

Если аргументу метода предшествует имя класса ( Person $spouse ), называемое подсказкой типа, это означает, что параметр должен быть экземпляром данного класса, иначе будет выдано сообщение об ошибке.

Чтобы получить имя моего супруга, вы можете написать:

1
echo $me->spouse->name;

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

Истинная оценка этой модели придет только со временем.

Испытайте свои новые найденные навыки. Как вы можете регистрировать и отображать твиты для пользователя на странице? Ну, первым шагом может быть определение класса, который представляет один Tweet . Этот класс должен хранить свойства тела твита, а также дату его публикации. Кроме того, следует убедиться, что содержание твита не превышает 140 символов. Вот первый удар в такой класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Tweet {
    public $body;
    public $pubDate;
 
    public function __construct($body)
    {
        $this->setBody($body);
        $this->setPubDate(new DateTime);
    }
 
    public function setBody($body)
    {
        if (strlen($body) > 140) {
            throw new InvalidArgumentException;
        }
 
        $this->body = $body;
    }
 
    public function setPubDate(DateTime $date)
    {
        $this->pubDate = $date->format(‘Y/m/d H:i:s’);
    }
}

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

Одна интересная новая функциональность связана с методом setBody . Если предоставленный текст превышает 140 символов, которые мы можем вычислить, используя функцию strlen PHP, то мы должны сделать исключение, поскольку это нарушает правила твита. Исключение может быть выдано с использованием синтаксиса, throw new ExceptionType .

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

01
02
03
04
05
06
07
08
09
10
11
$tweets = [];
 
# add two new tweets to the array
$tweets[] = new Tweet(‘Going to the store.’);
$tweets[] = new Tweet(‘Back from the store!’);
 
# Filter through, and display on page.
foreach($tweets as $tweet) {
    echo «<h2>{$tweet->body}</h2>»;
    echo «<p>Posted on: {$tweet->pubDate}</p>»;
}

После просмотра результатов в браузере вы должны увидеть что-то вроде:

Отлично, но как мы можем сохранить эти твиты?


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

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

Установка MySQL не входит в рамки данного руководства. Вместо этого обратитесь к этому руководству по Nettuts + для полного ознакомления.

Вот упрощенный пример, с которого можно начать безопасное извлечение строк из таблицы базы данных. Не волнуйтесь, если это кажется ошеломляющим. MySQL — ваш второй новый язык для изучения. API PDO PHP, а также сам язык запросов требуют времени для изучения.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
function connect() {
    $conn = new PDO(
        ‘mysql:host=localhost;dbname=DB_NAME’,
        ‘USERNAME’,
        ‘PASSWORD’
    );
 
    $conn->setAttribute(
        PDO::ATTR_ERRMODE,
        PDO::ERRMODE_EXCEPTION
    );
 
    return $conn;
}

PDO — это один из трех доступных API-интерфейсов PHP для подключения к базе данных MySQL.

Далее мы добавим вспомогательную функцию для извлечения всех записей из таблицы твитов. Обратите особое внимание на аргумент метода query , SELECT * FROM tweets . Это специальный язык для запросов к базе данных. В этом случае мы используем символ * для ссылки на все строки. Таким образом, мы выбираем все строки таблицы, называемые tweets .

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

1
2
3
4
5
function fetchTweets($conn) {
    $stmt = $conn->query(‘SELECT * FROM tweets’);
 
    return $stmt->fetchAll(PDO::FETCH_OBJ);
}

Теперь с установленным этапом нам нужно только вызвать функции, соответственно.

1
2
3
4
5
# Connect to the DB
$conn = connect();
 
# Fetch all rows from attendees table
var_dump(fetchTweets($conn));

Простой способ var_dump содержимое переменной — использовать функцию var_dump . Если вы передадите вывод fetchTweets($conn) в эту функцию, после просмотра в браузере вы увидите что-то вроде:

var_dump полезен для отладки, но в производственных целях лучше фильтровать результаты и правильно отображать их на странице. Оператор foreach , с которым вы уже знакомы, отлично справится с этой задачей!

1
2
3
4
5
6
$tweets = fetchTweets($conn);
 
foreach($tweets as $tweet) {
    echo «<h2>{$tweet->body}</h2>»;
    echo «<p>{$tweet->pubDate}</p>»;
}

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

Лучший способ научиться это делать. Создавайте выбрасываемые проекты, как будто они выходят из моды Методы, описанные в этом руководстве, проведут вас через первый этап, но, по мере развития ваших навыков, вы перейдете к более сложным темам, таким как PHP-фреймворки, шаблоны проектирования и разработка на основе тестов. Веселиться!