Статьи по PHP MySQL

Серверное программирование
Аватара пользователя
Scamper
Постоялец
Сообщения: 67
Зарегистрирован: 17 дек 2014, 18:09
Откуда: Екатеринбург
Контактная информация:

Статьи по PHP MySQL

Сообщение Scamper » 21 дек 2014, 13:23

Статьи по PHP MySQL (Тут вы сможете прочитать интересные статьи по PHP MySQL)

Статьи по PHP MySQL
Объектно-ориентированное программирование, классы
Дмитрий Лебедев

10.12.2000

Мой путь к пониманию объектов шел слишком долго. Надо сказать, что закончился он чрезвычайно неожиданно - я прочел... мануал PHP 4. Где можно найти толковое описание, только не там, казалось бы... Правда, уже до этого я кое-что знал ("...объект, сочетающий в себе как совокупность данных, так и действий над ними." (с) Епанешников, "Программирование в среде Turbo Pascal 7.0"), но это уже детали.

Что же такое класс и объект. Сперва об объекте. Определение "...сочетающий в себе как совокупность данных, так и действий над ними" - вполне подходящее. Если говорить "приземленно", то объект в PHP - это переменная особого типа. В ней содержатся специально объявленные под-переменные и функции этого объекта (то, что объект содержит переменные и функции, в научной литературе называется инкапсуляцией). Функция is_object на эту переменную выдает true:

if (is_object($objectname)) {
do_something();
};

Обращение к под-переменной объекта производится следующим образом (название, конечно же неправильное, правильно "свойство объекта").

$objectname->property

print ($objectname->property);

Вызов функции (метода) объекта:

$objectname->format_output($format);

Конечно же неудобно писать имя объекта и "стрелочку" ("->") перед нужной переменной, но это только поначалу. Зато потом можно сэкономить большой объем программного кода (и избежать лишней головной боли).

Теперь что такое класс. Класс - значит класс объектов. В PHP-скриптах описывается не объект. Сначала описывается класс объектов, и затем можно создавать сколько угодно объектов этого класса.
Code

Код: Выделить всё

<?
class Public_Transport {
   var $capacity = 0;
   var $passengers = 0;
   var $stop = array;
   var $current_stop = 0;
   var $vehicle = "unknown";

   function say_stop () {
     echo $this->stop[$this->current_stop];
     if ($this->current_stop==sizeof($this->stop)-1)
       echo ". Конечная.";
     else
       echo " следующая - ", $this->stop[$this->current_stop+1];
     }

   function stop () {
     $this->passengers += intval(rand((-1*$this->passengers),100));
     if ($this->passengers > $this->capacity) {
       echo "Освобождаем двери!";
       $this->passengers = $this->capacity;
       };
     }

   function go () {
     $this->current_stop++;
     }
   }
?>

ВНИМАНИЕ! Закрывающая скобка класса должна быть без точки с запятой (""), как и все описания функций внутри описания класса.
Программа, работающая с классом Общественный_Транспорт будет выглядеть так:
Code

<?
$bus = new Public_Transport;
$bus->capacity = 200;
$bus->vehicle = "Лиаз-767";
$bus->stop = array ("Торговый центр", "Поликлиника", "Институт теплофизики", "Вычислительный центр", "Институт ядерной физики", "Институт гидродинамики", "Морской проспект", "Дом ученых", "ул. Жемчужная", "Цветной проезд");

while ($bus->current_stop < sizeof($bus->stop)) {
$bus->say_stop();
$bus->stop();
$bus->go();
};

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

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

<?
$a = "bukva a";
$b = "bukva b";
$c = "a";
echo $$c;
?>
Такой код выведет "bukva a". И то же самое можно делать с объектами и их свойствами:
Code

<?
class someclass1 {
var $a = 1;
var $b = 2;
var $c = 3;
}

class someclass2 {
var $a = 4;
var $b = 5;
var $c = 6;
}

$d = new someclass1;
$e = new someclass2;

$f = "d";
$g = "c";

echo ${$f}->{$g};
?>

(такой код выдаст "3")
То же касается и динамических имен функций.

В руководстве по PHP4 написано подробнее о динамичесих именах переменных [1] и изменяемых именах функций [2].

И на прощанье вот что. В начале года мне надо было написать скрипт для рассылки новостей и прайс-листов подписчикам. Зашел я на сайт PHP и заглянул в мануал по функции mail() [3], чтобы найти что-нибудь про аттачмент. В комментариях к функции я нашел то, что искал - класс для вложения файла в письмо. За восемь месяцев туда накидали много ссылок на такие классы, а в феврале он был единственный - CMailFile [4]. Так вот, как они делают - делать не надо (я тогда в классах разбирался смутно, и просто вырезал функции, несколько упростив код). Процитирую заголовки функций:
Code

class CMailFile {
var $subject;
var $addr_to;
var $text_body;
var $text_encoded;
var $mime_headers;
var $mime_boundary = "--==================_846811060==_";
var $smtp_headers;

function CMailFile($subject,$to,$from,$msg,$filename,$mimetype = "application/octet-stream", $mime_filename = false) {
/* если функция имеет то же имя, что и класс, то это будет конструктор класса (см. ниже) */

function attach_file($filename,$mimetype,$mime_filename) {
/* Вот это не понимаю! attach_file вызывается из функции CMailFile - зачем? Только для красоты. А так - можно было этот кусок кода вставить прямо в главную функцию, раз уж решено сделать единовременный вызов функции. Далее идут несколько функций того же назначения и характера. */
function encode_file($sourcefile) {
function sendfile() {
function write_mimeheaders($filename, $mime_filename) {
function write_smtpheaders($addr_from) {

}

/* А вот пример использования класса. */

// usage - mimetype example "image/gif"
// $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype);
// $mailfile->sendfile();


Зачем было оформлять это как класс - непонятно. Только для красоты и разделения функции на несколько штук. А вообще-то, если я захочу на ходу поменять адресата (например, для той же рассылки, когда я прохожу циклом по массиву адресов), надо снова вызывать функцию CMailFile, которая перекодирует файл снова, требуя определенных системных ресурсов.
Раз уж я начал ругать другого, покажу, как по моему мнению правильнее использовать ООП для рассылки писем. В следующем выпуске посвященном приемам ООП (а перед, думаю, ним будуд два других) я хочу привести пример использования класса для отправки почтовых сообщений, в том числе для рассылок.
Ссылки, использованные в выпуске:
1) http://www.php.net/manual/language.vari ... riable.php
2) http://www.php.net/manual/functions.var ... ctions.php
3) http://www.php.net/manual/function.mail.php
4) http://renoir.vill.edu/~ylee/mailfile.html
Полная версия выпуска: http://detail.phpclub.net/5
© Дмитрий Лебедев <dnl@au.ru (mailto:dnl@au.ru") >
© Клуб PHP-разработчиков <http://detail.phpclub.net/jump.phtml?url=phpclub.net>

Статья взята с http://php.pnz.ru/index.php?module=articles&id=4

Приемы в PHP
Предсловие
Описываются приёмы хорошего стиля программирования применительно к PHP. Использование данных приёмов позволяет увеличить призводительность программирования на 30%, а так же упростить отладку и сопровождение Web-приложений.

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

Почему же PHP так популярен и каким образом столько человек разом обучилось PHP? Дело в том, что большинство PHP-программистов не изучало язык с нуля, а изучало его либо уже зная С/С++, либо Perl. Perl является C-подобным языком программирования (как и PHP), а является предшественником PHP, можно сказать что PHP это Web-ориентированный Perl. Поскольку, PHP просто логически следует из Perl и широкое распространение получил именно из-за того, что программистам было легко переходить с Perl на PHP (ну и с С на PHP, тоже).

Замечание
Цитата: Язык Perl появился в 1986 году по воле системного программиста Лари Уолла. Созданный первоначально как средство обработки текстовых файлов, призванное облегчить жизнь системному администратору UNIX, он превратился в настоящий язык программирования. Традиционные области, в которых Perl применяется особенно часто и успешно, — создание приложений CGI, системное администрирование UNIX, обработка текста.

Кроме того, свой вклад вносит предметная область — программирование для сети Интернет. Для серьёзного понимания которого желательно знание очень многих вещей (HTML, SQL, UNIX, прикладных протоколов — хотя бы HTTP, стилей программирования на С, Perl, Java).

Когда большинство PHP-программистов переходят в мир PHP с багажом другого языка программирования (их стиль уже устоялся), спрос на литературу, в которой бы обсуждались азы программирования не так велик. Новичкам бывает трудно найти информацию об организации кода. Мы надеемся, что эта статья поможет поставить свой собственный стиль, что в конечном итоге может увеличить скорость разработки на 30% и помочь при работе в команде, когда ваш код будет читаться другими программистами, а вам соответственно придётся читать чужой код.

Расстановка фигурных скобок и отступы

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

1) Рациональный стиль

Это один из наиболее распространенных стилей, так как им пользовались Керниген (Kernighan) и Ричи (Ritchie), авторы языка C.

Код:
Code

<?php
if($flag){
echo "Hello world!";
}
?>
Преимущество этого подхода заключается в экономии вертикального пространства, жизненно важного при отладке большого блока кода. Оборотной стороной такого подхода является то, что может оказаться трудным найти символ {, спрятанный в конце строки. Этого стиля придерживаются и Java-программисты, как-то приписывает Sun.

2) Стиль Алмена

Эрик Алемен (Eric Allman) написал утилиты BSD в этом стиле, поэтому этот стиль часто называют "стиль BSD":

Цитата:
Code

<?php
if($flag)
{
echo "Hello world!";
}
?>
Аргументом в поддержку такого стиля является тот факт, что область видимости блочного оператора ясна и визуально ассоциируется с управляющим оператором.

3) Стиль Whitesmith

Данный стиль предписывает использование следующей расстановки фигурных скобок

Код:
Code

<?php
if($flag)
{
echo "Hello world!";
}
?>
Этот стиль имеет преимущество в том, что скобки более тесно ассоциируются с кодом, который они включают и разграничивают, однако при визуальном просмотре текста отыскать скобки оказывается чуть более сложно.

4) Стиль GNU

Программисты GNU фонда Free Software Foundation используют следующий стиль расстановки фигурных скобок

Код:
Code

<?php
if($flag)
{
echo "Hello world!";
}
?>
Внутри любых управляющих конструкций операторы следует располагать с отступом на одинаковое число пробелов, например для операторов if-then-else код должен выглядеть следующим образом:

Код:
Code

<?php
$flag = true;
if($flag)
{
echo "Переменная равна true";
exit();
}
else
{
echo "Переменная равна false";
exit();
}
?>
Число может быть любым, обычно используют 2, 4 или 8 пробелов. Старайтесь придерживаться этого правила, некоторые программисты приходят в бешенство когда это число не кратно 2 :) Наиболее оптимальным является использование 2 пробелов, так как при их большем числе вложенные блоки становятся "растянутыми" и их становится сложно воспринимать.

Пробелы вокруг символов

Бинарные операторы следует обрамлять пробелами:

Код:
Code


<?php
// Неправильно
$a=$b+$c*$d;
// Правильно
$a = $b + $c * $d;
?>
Символ пробела ассоциируется с новым словом, поэтому формула читается не как непонятный набор символов, а как нечто осмысленное.

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

PHP собрал в себе практически все комментарии современных языков программирования, наряду с однострочными комментариями в стиле shell-скриптов (#)

Код:
Code

Код: Выделить всё

<?php
   # Программный модуль index.php
   echo "Hello world!";
?>

и С++ (//)

Код:
Code

Код: Выделить всё

<?php
   // Программный модуль index.php
   echo "Hello world!";
?>

можно использовать многострочный комментарий в стиле C:

Код:
Code

<?php
/* Это многострочный комментарий в стиле С
он охватывает несколько строк – не допускается
вложенных комментариев
*/
echo "Hello world!";
?>
К хорошему тону относится использование однострочных комментариев для короткого комментария, а многострочного — для комментария, охватывающего несколько строк. Не возбраняется использовать однострочные комментарии для большого текста, особенно в начале файла или важного блока кода

Код:
Code

<?php
/////////////////////////////////
// Гостевая книга
/////////////////////////////////
?>
Как и при работе с отступами и фигурными скобками, основным требованием является необходимость придерживаться одного стиля во всех программных блоках.

При расстановке однострочных комментариев возможно два варианта: непосредственно перед выполняемым оператором

Код:
Code

<?php
// Вывод текстовой строки в окно браузера
echo "Hello world!";
?>
и после точки с запятой

Код:
Code

<?php
echo "Hello world!"; // Вывод текстовой строки в окно браузера
?>
Лучше придерживаться первого правила, так как строка получается длинной и плохо воспринимается читающим. Единственным оправданием использования такого комментария является комментирование закрывающейся скобки длинного программного блока, содержащего много вложенных блоков.

Код:
Code

Код: Выделить всё

<?php
   if($tot)
   {
      while($position = next($tot))
      {
         /* Очень длинный код
            содержащий много
            вложенных блоков
            ...
         */
         if($flag)
         {
           echo "Ошибка";
           exit();
         }
      } // Конец while($position = next($tot))
   }
?>

Имена переменных и функций
Существует несколько стилей названия переменных

$var_bell — стиль C: нижний регистр, знак подчёркивания.

$VarBell — стиль Pascal: каждая подстрока в названии начинается с большой буквы.

$varBell — стиль Java: первая строка начинается с маленькой буквы, все последующие с большой.

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

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

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

Рассмотрим несколько примеров. Часто временные строки для хранения SQL называют $query (запрос) — это очень удачное название, ассоциирующееся именно с SQL-запросом. Обычно на этом всё и заканчивается. При появлении второго запроса, вторая переменная получает имя $query1 — это порочная практика. Обычно запросы в рамках одного скрипта отличаются своим действием: один SQL-запрос может выполнять обновление (UPDATE), другой выборку (SELECT), поэтому переменные лучше называть с указанием действия оператора: $query_update и $query_select, соответственно.

Часто можно увидеть код
Код:
Code

Код: Выделить всё

<?php
   $query = "SELECT * FROM catalog";
   $query1 = mysql_query($query);
   while($result = mysql_fetch_array($query1))
   {
      /* Код обработки */
   }
?>

Здесь дескриптор запроса, возвращаемый функцией mysql_query() назван $query1, это здорово запутывает как разработчика, так и читающего текст программы. Дескриптор не несёт физического смысла — это лишь ключ к результату, поэтому его лучше называть сокращённым именем таблицы

Код:
Code

Код: Выделить всё

<?php
   $query = "SELECT * FROM catalog";
   $cat = mysql_query($query);
   while($catalog = mysql_fetch_array($cat))
   {
      /* Код обработки */
   }
?>

Статья взята с http://www.webcorp.ru/page/styles_code.html



Статьи:: Интернет технологии :: PHP :: Оптимизация PHP скрипта - "правильный" PHP
отправить ссылку другу версия для печати Обсудить на форуме

Оптимизация PHP скрипта - "правильный" PHP

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

0. При вставке кусков PHP-кода в HTML страницы всегда используйте полные открывающие и закрывающие скобки <?php и ?>! Это обезопасит Вас от вариаций настройки php.ini short_open_tag на разных серверах и возможно сэкономит много времени при переносе или загрузке проектов на разные сервера.

1. Старайтесь использовать функцию вывода echo заместо printf и sprintf там где возможно. Нет надобности использовать эти функции , так как они выполняются медленней потому, что созданы для интерпретации и выводов строки с ее обработкой, подстановкой значений, в форматированном виде. О чем и говорит буква f в конце названия этих 2-х функций.

Плохо:

Code

sprintf('мама');
printf('папа');
Хорошо:

Code

echo 'мама';
echo 'папа';
2. По тем же причинам используйте одинарные кавычки там где это возможно и пользуйтесь оператором "." для склейки строк, заместо прямой подстановки переменный в строку, заключенную в кавычки.

Лучший вариант(самый быстрый)

Code

echo 'Вес равен: '.$weight;
Худший вариант(медленный):

Code

echo "Вес равен: $weight";
3. Если Вам нужно проверить не равно ли возвращенное значение функции нулю(а функция сама по себе возвращает только положительные или только отрицательные значения), то лучше использовать оператор сравнения. Он выполняется быстрей, нежели конкретное сравнение значений.

Плохо:
Code

Код: Выделить всё

$i = 0;
if ($i != 0)
  {
      //Не равно
  } 
else
  {     
      //Равно 
  }
Хорошо:
Code

$i = 0;
if ($i > 0)
  {
      //Не равно
  }
  else
  {
      //Равно
  }

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

4. Для проверки строки на пустоту используйте функцию trim($str); Она не только проверит заполнена ли строка, но также обрежет несущественные символы - пробелы (табуляции, white-spaces) и вернет положительное значение, в случае если в строке ей действительно какие то значимые символы.

Плохо:
Code

if ($str != '')
{
//обработка строки
}
Надо:
Code

if (trim($str))
{
//обработка строки
}
5. Для получения данных из форм методом Get и Post лучше использовать следующий минимальный набор самописных функций:
Code

GetParam ($array, $value, $default = '')
{
return (isset($array[$value])) ? $array[$value] : $default;
}

GetParamSafe ($array, $value, $default = '')
{
return (isset($array[$value])) ? addslashes($array[$value]) : $default;
}
Функция GetParam($_POST, 'myvar', 'empty') к примеру коректно получит данные из $_POST['myvar'], и в случае если $_POST переменная не существует вернет значение по умолчанию, без всяких Waring и Notice. Фунция GetParamSafe($_POST, 'myvar', 'empty') делает ту же операцию, только возвращает экранированную переменную. Для защиты от SQL инъекций к примеру. А данная конструкция позволяет получить целочисленное число из $_POST.

intval(GetParam($_POST, 'myvar', 'empty')):

В случае если в массиве $_POST лежало совсем не число функия вернет 0;

6. Для простого сравнения строк не используйте preg_match() или preg_match_all(). Используйте strstr() и strpos().

7. При получении строк из базы данных (MySQL к примеру) старайтесь использовать функцию mysql_fetch_object. К примеру при изменении кода запроса с

Code

$query = "SELECT field7, field3 FROM mytable WHERE id = 5" на
$query = "SELECT * FROM mytable WHERE id = 5"

код вывода строки полученной из этих запросов
Code

$row = mysql_fetch_array(mysql_query($query));
echo $row[0].'-->'.$row[1]; //перестанет работать, в то время, как

$row = mysql_fetch_object(mysql_query($query));
echo $row->field7.'-->'.$row->field3; // останется рабочеспособным.

8. При использовании сессий для авторизации на сайте, храните в сессии хотя бы IP-адрес, с которого был совершен вход. Так же проверяйте IP входа с текущим IP адресом каждый раз при выполнении закрытого скрипта. Например если злоумышленнику удастся украсть название сессии, то войти он в закрытую часть уже не сможет. Потому что в общем случае у него будет другой IP-адрес.
9. При формировании больших запросов вставки данных в БД через insert все строчки старайтесь поместить в один-три insert'а. Выполнение каждой строчки отдельно не только загрузит сервер БД, но и задержит работу Вашего скрипта.

10. В случае если необходимо в разных местах (разных классах) одной системы использовать одни и те же сложно вычисляемые данные (например которые достаются из БД через запрос с последющей обработкой строк), старайтесь их вычислять единожды, хранить глобально для всей системы и передавать в класс(скрипт) один раз, непосредственно при создании класса (подключении скрипта)

11. При брольших нагрузках на Web-сервер задумайтесь над использованием стандартных решений для включения кэша(кэш-технологии). Например бесплатный PHP класс JCache_Lite_Function. 12. При проектировании/разработке больших систем отдавайте предпочтение Объектно-Ориентированному программированию с использование шаблонов проектирования. Наиболее частые шаблоны: MVC, PageController, BodyHandler, Fabric...

To be continued...

Статья находиться http://www.realcoding.net/article/view/4812


ООП. Наследование классов в php
Классы в php версии 5 могут наследоваться, т.е. приобретать свойства и методы своего родителя. А зачем вообще нужно наследование классов?
Рассмотрим наследование на примере человека. Я - человек. И я наследую некоторые свойства класса Человек, например возможность говорить, интеллект, необходимость в воздухе, воде, пище и всяких витаминах. Эти свойства не уникальны для каждого отдельного человека, т.е. всем людям присуще то, что я перечислил. Мы еще можем заметить, что класс Человек наследует зависимость от воды, воздуха и пищи у класса Млекопитающие. А этот класс наследует эти свойства у класса Животные.

Благодаря наследованию мы можем очень много сэкономить на описании реального объекта. Например, спросите меня - что такое утка? Я отвечу: это птица, которая крякает. Я вроде бы сказал всего 4 слова, но полностью в этих четырех словах уместилась вся необходимая информация для описания утки, потому что сказав «птица, которая крякает», я дал вам знать, что утке присущи все свойства птицы плюс свойство «кряканье» :)

Наследуем

Короче тем самым объектно-ориентированные языки позволяют создавать модели, очень близкие к реальному миру. Для примера студентов и аспирантов мы можем сказать, что аспирант - это не простой студент. Он обладает дополнительными свойствами, но одновременно он обладает и всеми свойствами студента. Поэтому мы можем унаследовать класс GraduateStudent (аспирант) от класса Student (студент) с помощью ключевого слова extends:
Code

<?
class Student {
}
class GraduateStudent extends Student {
}
?>
Тут класс Student будет называться базовым, а класс GraduateStudent - производным.

Наследование еще позволяет нам избавиться от повторения кода, потому что все открытые (public, protected) методы и свойства класса Student становятся доступными и в классе GraduateStudent. Помните, в статье ранее я говорил, что модификаторы доступа методов/свойств private и protected отличаются? Вот. Если у нас есть свойство (или метод) private в классе Student, то оно не будет доступно в классе GraduateStudent:
Code

Код: Выделить всё

<?
     class Student {
         private   $mark;
         protected $average;
     }

     class GraduateStudent extends Student {

         function someFn() {
             $this->mark = 5;      // Ошибка доступа!
             $this->average = 4.4; // А так правильно
         }

     }
?>

Кстати. Помните, что если свойство или метод в классе не имеют модификатора доступа, то по умолчанию они public? Видимо это было введено для совместимости с предыдущими версиями пхп, где модификаторов еще не было, а все члены класса были публичными.

Вспомним еще конструкторы и деструкторы. Так вот, если нам надо вызвать конструктор или деструктор базового класса, то надо это делать явно, через указатель parent:
Code

Код: Выделить всё

<?
     class MyClass {
         function __construct() {
             echo "Запущен конструктор базового класса";
         }
         function __destruct() {
             echo "Запущен деструктор базового класса";
         }
     }

     class MyClass1 extends MyClass {
         function __construct() {
             parent::__construct();
         }
         function __destruct() {
             parent::__destruct();
         }
     } 

     $obj = new MyClass1(); // Выводит "Запущен конструктор базового класса"
     unset($obj);           // Выводит "Запущен деструктор базового класса"
?>

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

Абстрактные классы и методы

Это тоже новинка в PHP5. Абстрактные методы имеют только объявление и не имеют реализации. Класс, который содержит такие методы, должен быть обязательно объявлен как абстрактный:
Code

Код: Выделить всё

<?
     abstract class MyClass {
         abstract public function fn();
     }
?>
Т.е. если бы мы написали так…
Code
<?
     abstract class MyClass {
         abstract public function fn() {
         }
     }
?>

…интерпретатор пхп заругался бы на нас.

Абстрактные классы могут еще содержать и обычные (не абстрактные) элементы. Создать объект абстрактного класса мы не имеем права. Можно только определять новые классы от базового абстрактного класса и создавать объекты уже от производных классов.

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

А здесь я приведу пример, как использовать абстрактный метод базового класса в производном классе:
Code
<?
abstract class MyClass {
abstract public function fn();
}

class MyClass1 extends MyClass {
public function fn() {
echo “привет”;
}
}

$obj = new MyClass1;
$obj->fn(); // Выводит “привет”
?>
Интерфейсы

В моем понимании интерфейс - нечто, с помощью чего мы можем управлять объектом. Например, возьмем телевизор. У него есть интерфейс - панель с кнопками спереди под экраном или справа (слева) от экрана. Ну пульт управления - это тоже интерфейс. Т.е. большинство из нас не знает, как сделан телевизор и как он работает, но мы знаем, как им можно управлять (переключать каналы, настраивать громкость, яркость и т.д.). То же самое было придумано и в программировании.

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

Основное отличие интерфейсов от абстрактных классов - в том, что в PHP 5 класс не может быть порожден от нескольких классов (и абстрактных в т.ч.), но зато может быть создан на основе любого числа интерфейсов. При этом в интерфейсе методы должны объявляться ключевым словом function без указания всяких спецификаторов (в т.ч. и abstract):
Code

Код: Выделить всё

<?
     interface Inter1 {
         function fn1();
     }

     interface Inter2 {
         function fn2();
     }

     class MyClass implements Inter1, Inter2 {
         public function fn1() {
             echo 1;
         }
         public function fn2() {
             echo 2;
         }
     }
     $obj = new MyClass;
     $obj->fn1(); // Выведет 1
     $obj->fn2(); // Выведет 2
?>

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

Финальные методы и классы

Интересная возможность в пхп 5, на которую я наткнулся в ходе изучения ООП, - это возможность определять финальные методы и классы.

Метод, который мы определили с ключевым словом final, в дальнейшем мы не можем переопределить в классах, которые производны от нашего класса:
Code

Код: Выделить всё

<?
     class MyClass {
         final public function fn() {
             // Код метода
         }
     }
     class MyClass1 extends MyClass {
         // Следующий код вызывает ошибку
         // переопределения финального метода
         // базового класса MyClass
         public function fn() {
             // Код метода
         }
     }
?>

И еще: если мы используем final при определении самого класса, то не сможем больше породить от него другие классы:

Код: Выделить всё

Code

<?
     final class MyClass {
         // Код описания класса
     }

     // Следующий код вызывает ошибку
     // порождения от финального класса
     class MyClass1 extends MyClass {
         // Код описания класса
     }
?>

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

А как насчет свойств? Свойства класса определять финальными нельзя. Ну в этом не было бы смысла, думаю. Потому что, в отличие от методов, мы не можем переопределять свойства класса. Мы можем их только наследовать.

Выводы:

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

Статья сама с http://i-novice.net/oop-nasledovanie-klassov-v-php/

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость

cron