5. ООП в PHP5. Константы в классах

👁 88 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Бывает так, что объект имеет постоянные характерные для себя значения, допустим, значение PI=3.14, E=2.7, G=8.9 и т.д. И для сохранения подобных констант нам необходимо будет создать константы в классе.

Для создания константы используется ключевое слово const и дальше пишется название константы без знака $, так как это уже будет как признак переменной. Еще принято писать константы в верхнем регистре в остальном не должны начинаться с цифр или содержать спец-символ, кроме символа подчеркивания и еще одна особенност констант — в том, что их сразу же надо объявлять при создании и это значение всегда будет в нем оставаться. Конечно, можно переопределить константу через функцию define(), здравый смысл подсказывает, что делать этого нельзя, хотя, решать вам :).

После того, как мы определили константу к нему еще надо обратиться через объект, но так как это не переменна, то доступ к константе и для этого существуют 4 способа, 2 из которых задействован начиная с PHP 5.3.

1. Доступ внутри класса — способ, при котором к константе можно обратиться через ключевое слово self:: или через название класса:


class MyClass{
  const MY_CONST = 3.14;
  public function myMethod()
  {
     echo self::MY_CONST + MyClass::MY_CONST;// Будет все равно, что 3.14*2
  }
}

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

MyClass::MY_CONST

который мы уже использовали выше;

3. Другой вариант — более новый, который поддерживается с версии 5.3 -‘это через имя объекта, если у нас есть несколько объектов(экземпляров) одного и того же класса, то через все эти объекты мы можем обратиться к ,определенной в данном классе, константе и значение всегда будет одно и то же, независимо какой объект, вот к примеру:


$newObj_1=new MyClass();
$newObj_2=new MyClass();
echo $newObj_1::MY_CONSTANT;//3.14
echo $newObj_2::MY_CONSTANT;//3.14

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


$newVar_1="MyClass";
$newVar_2="MyClass";
echo $newVar_1::MY_CONSTANT;//3.14
echo $newVar_2::MY_CONSTANT;//3.14

Вот и все особенности констант в ООП PHP :).

4. ООП в PHP5. Свойства класса

👁 84 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Настало время поговорить о свойствах класса(или полях). Если в ООП класс описывает какую-то сущность, реальный объект, то он, чтобы описать этот объект должен содержать некие переменные, в которых находятся количественная харектиристика того или  иного объекта в действии. Допустим, у нас есть класс фигуры круга, то каждый экземпляр должен содержать свойства данной фигуры -цвет, координаты, размер радиуса в различных местах его использования вот для таких целей нам и нужны переменные(свойства).   Каждое свойство может иметь один из 3 модификаторов доступа — public, protected и private:

 
class Circle{
       public $x=0;
       protected $z=0;
       private $y=0;
//Методы для установки данных
public function setX($new_x)
{
$this->x=$new_x;
}
public function getY($new_y)
{
$this->y=$new_y;
}
public function getZ($new_z)
{
return $this->z=$new_z;
}

//Методы для получения данных
public function getX()
{
return $this->x;
}
public function getY()
{
return $this->y;
}
public function getZ()
{
return $this->z;
}
}

//Создадим объект
$newObj=new Circle();
/*1 способ установки и получения значений свойств для объекта*/
//Зададим свойства через метод установки
$newObj->setX(1);//Можно-через метод можно задать значение открытому св-ву
$newObj->setY(2);//Можно-через метод можно задать значение защишенному св-ву
$newObj->setZ(3);//Можно-через метод можно задать значение закрытому св-ву
//Получим свойства через методы возврата
echo $newObj->getX(1);//Можно-через метод можно получить значение открытого св-ва
echo $newObj->getY(2);//Можно-через метод можно получить значение защишенного св-ва
echo $newObj->getZ(3);//Можно-через метод можно получить значение закрытого св-ва
/*2 способ установки и получения значений свойств для объекта*/
//Зададим свойства через сам объект
$newObj->x=1;//Можно-через объект можно задать значение открытому св-ву
$newObj->y=2;//Нельзя-через объект нельзя задать значение защишенному св-ву
$newObj->z=3;//Нельзя-через объект нельзя задать значение закрытому св-ву
//Получим значения свойств через объект
echo $newObj->x;//Можно-через объект можно взять значение открытого св-ва
echo $newObj->y;//Нельзя-через объект нельзя взять значение защишенного св-ва
echo $newObj->z;//Нельзя-через объект нельзя взять значение закрытого св-ва

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

3. ООП в PHP5. Классы и объекты

👁 94 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Из продыдущего урока мы уже знаем что такое ООП и рассмотрели, теоретически, что такое класс и объект.

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

Объявление класса

Класс объявляется с помощью ключевого слова class, за которым следует имя класса и тело из фигурных скобок с реализацией его членов(свойств и методов). Имя класса может содержать буквы латинского алфавита и подчеркивание в сочетании с цифрами, но не начинаться с цифры, а также имя класса не должно повторять зарезервированное под PHP инструкцию языка на примере class, int, Array, private… . Рассмотрим пример реализации класса:


  class StudentA
  {
    public $name;
    private $age;
    protected $gender;

    public function sayName()
     {
         echo "Joobs!;
     }
  }

Выше в примере мы создали класс с именем StudentA, внутри которого создали свойства с различным доступом (protected, private, public) и реализовали метод sayName(), который, глядя на имя, можно понять что делает. В данном случае мы реализовали внутри класса некий чертеж , как именно должен собраться объект и, на основе открытых членов(свойств и методов) мы можем манипулировать этим объектом.

Создание объекта

Обект — по сути дела обычная переменная, которая хранит лишь ссылку на внутреннюю реализацию класса

2.ООП в PHP 5. Основы

👁 141 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Начнем с того, что такое класс и какую роль он играет в ООП. Данная часть поста может быть ориентирована на любой язык, в котором поддерживается ООП, так как ООП — по сути дела единая модель проектирования приложений и неважно на каком языке — будь-то Java, С#, C++, PHP… суть ООП во всех языках одна и та же — предоставить некий принцип, на основе синтаксиса языка, по которой можно было бы легко и быстро проектировать любой проект, за вами остается только изучить инструмент, в нашем случае PHP, познать все тонкости реализации ООП в этом языке, и используя их решать нашу задачу.

 Элементы ООП. Классы и объекты

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

Принцип ООП
Принцип ООП

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

Дадим краткие описания всем 3-м этим понятиям:

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

2. Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя;

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

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

Наследование

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

Инкапсуляция

 

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

public,protected, private или еще — модификаторы доступа

На данном этапе. пока мы говорим об инкапсуляции, следует отметить о возможных вариантах инкапсуляции и их 3:

public — свойства и методы открыты и доступны из вне класса объектам данного класса и унаследованных классов;

protected — свойства и методы зашищены и доступны только внутри класса и и внутри унаследованных классов;

private — свойства и методы доступны только внутри класса и недоступны за его пределами , а также внутри унаследованных классов;

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

Полиморфизм

       Нам осталось разобрать что такое полиморфизм. Вы только поразмыслите как это слово звучит — поли(множественность) и морфи(форма), что означает многоформенность. Возьмем из реальной жизни такие сущности или объекты как автомобиль, самолет, мотоцикл и попробуем в них найти сходные элементы и первое , что приходит на мысль — это колеса, то все они движутся благодаря вращению колеса с малыми отличиями. Если это все применить к ООП, то у нас должен быть главная сущность, от которого будут унаследованы все данные колесные средства передвижения и тогда у всех будет метод go(), который специфичен для каждого объекта, т.е. отличен в передвижении, к примеру, самолет должен набирать скорость постепенно до определенного уровня, чтобы взлететь, а автомобиль может иметь 4 — 5 скоростей и задний заезд, против переднего мотоцикла и в этой ситуации, когда все эти классы унаследованы от колесного класса возникает потребность в переопределении данных методов в унаследованных классах. И тут мы вплотную приближаемся к понятиям абстрактные классы и интерфейсы, которые служат начальной основой для переопределяемого кода в парадигме ООП.

Сначала определимся с новыми понятиями:

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

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

Покажем все это на примере кода:


abstract class 	Machine {
 //определяем базовый общий метод
 abstract public function go();
}

//Унаследуем абстрактный класс и реализуем его абстрактный метод
class Auto{
  //Переопределяем абстрактный метод езды применительно к машине
  public function go()
  {
    echo("Правила езды для автомобиля");
  }
}

class Plane{
  //Переопределяем абстрактный метод езды применительно к самолету
  public function go()
  {
    echo("Правила езды для самолета");
  }
}

class Moto{
  //Переопределяем абстрактный метод езды применительно к мотоциклу
  public function go()
  {
    echo("Правила езды для мотоцикла");
  }
}

//Создаем экземпляры(объекты) этих классов

autoObj = new Auto();
planeObj = new Plane();
motoObj = new Moto();

//Попытаемся использовать и тогда
autoObj->go();//Выведет "Правила езды для автомобиля"
planeObj->go();//Выведет "Правила езды для самолета"
motoObj->go();//Выведет "Правила езды для мотоцикла"

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

Урок 1. Синтаксис языка PHP

👁 99 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Использование языка PHP

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

   
      <?php 
        //Код PHP 
      ?> 

или тегами :

      <? 
        //Код PHP 
      ?> 

Разница между ними в том, что теги <?php ?> будут работать всегда и они по умолчанию включены , а у прощенный вариант по умолчанию запрещен и чтобы их использовать вам будет необходимо через командную строку выполнить операцию   —enable-short-tags  либо изменить в конфигурационном файле поле short_open_tag   на 1.  Выше мы рассмотрели вариант вcтавки в HTML, но обычно PHP код пишется в отдельном файле с расширением *.php и потом включается как модуль операции к основному файлу, чтобы было легче отлаживать. Существует несколько, общепринятых, расширений файловых расширений для кода PHP — php, php5, phtm, phtml… и это никак не влияет на обработку и выполнение кода, главное, чтобы это расширение было разрешено сервером на обработку.

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

 


    <?php
      echo "Hello world";
      // ... еще какой-то код
      echo "Последнее выражение";
      // Скрипт заканчивается без закрывающего тега PHP

Не родные теги

Помимо этого есть еще несколько вариантов тегов, которые оптимизированы для работы с документами XML и XHTML, в особенности  — теги <script language=»php»></script>, которые нам известны из клиентского языка JavaScript, чтобы выполнился код , необходимо явно указать тип языка в атрибуте language=»php»:

<script language="php">
   echo 'Будут проблемы с некоторыми редакторами, на пример с FrontPage';
</script>

Другой способ — это теги <%  %> в стиле ASP и доступны они только, если вы их включили через директиву asp_tags в конфигурационном файле php.ini, и разрешены через short_open_tag в конфигурационном файле php.ini, либо если PHP был скомпилирован с опцией —enable-short-tags:


<% echo 'Вы можете по выбору использовать теги в стиле ASP'; %>

Если вы еще новичок в PHP, не стоит на этом акцентировать внимание, чтобы не заблудиться и смело используйте всегда проверенный вариант <?php  ?>, а остальное уже в силу овладения, дабы облегчить процесс разработки.

 Признак окончания инструкции

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


<?php
    echo 'Привет!';//Можно так
?>
<?php echo 'Привет!' //А можно и так, заметьте, не ставим точку с запятой, так как последний тег?>
<?php echo 'Опустили последний тег';//А можно и так

Комментарии

Все, что находится за пределами тегов PHP игнорируется и выводится как обычный текст или HTML для браузера и еще PHP игнорирует все, что находится за двумя косыми слешами // и между набором /**/ и является всего лишь комментарием для разъяснения принципа работы кода:


<?php
//Все, что за этими слешами является комментарием и игнорируется PHP,только на этой строке
/*Все, что внутри этого обрамления является комментарием и игнорируется PHP
можно перейти и на новую строку, но главное, чтобы все находилось внутри обрамления*/
?>

Кроме того, следует упомянуть об еще одном методе создания комментариев — это использование символа #:


  #Это тоже однострочный комментарий
  //как и это
  /*
  А это многострочный
  */

1. ООП в PHP 5. Вводная часть

👁 103 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

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

Как ООП работало в PHP 4

В PHP 4 , несмотря на то, что ООП поддерживался, но он был еще очень сыроват для данного языка, главной особенностью было прожорливость ресурсов, так как объекты или экземпляры работали как копии, а не как ссылочные типы, как это сделано в Java или в C#, отсутствовала безопасное использование полей и методов.

Приведем пример:

class MyClass{

    var $field;

    function setField($variable) { this ->field = $variable; }
    function getField() { return  this ->field = $variable; }

} 
function setNewName($object, $name) 
{ 
    $object->setField($name); 
} 
$object = new MyClass(); 
$object ->setField("Вася"); 
setNewName($object, "Маша"); 
echo getField();//Выведет "Вася"

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

Что нового в PHP 5

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