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

👁 73 просмотров

Бывает так, что объект имеет постоянные характерные для себя значения, допустим, значение 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. Свойства класса

👁 67 просмотров

Настало время поговорить о свойствах класса(или полях). Если в ООП класс описывает какую-то сущность, реальный объект, то он, чтобы описать этот объект должен содержать некие переменные, в которых находятся количественная харектиристика того или  иного объекта в действии. Допустим, у нас есть класс фигуры круга, то каждый экземпляр должен содержать свойства данной фигуры -цвет, координаты, размер радиуса в различных местах его использования вот для таких целей нам и нужны переменные(свойства).   Каждое свойство может иметь один из 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;//Нельзя-через объект нельзя взять значение закрытого св-ва

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

Разница между интерфейсом и абстрактным классом

👁 88 просмотров

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

Итак, давайте разберемся с основными понятиями иначе, зачем нам работать на интсрументе, название которого нам непонятно, не так ли? 🙂

Интерфейс (interface) — это некая совокупность возможностей или методов выполнения операций над объектом или объектами;

Абстракция (abstraction) -придание сущности или объекту некоторых конкретных черт, отвергая при этом несущественных;

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

Именования интерфейсов и абстрактных классов

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

При создании интерфейса им следует давать названия , которые описывают возможности объекта, которые могут обозначать прилагательное или причастие речи,к примеру : Flexible(изгибающийся),  Comparable(сравнимый), Sizeable(масштабируемый) и т.д.

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

 

Связь триединства сущности — интерфейс, абстракция, класс.

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

Покажем пример:


//Определим абстракцию фигуры
abstract class Figure{
    public $width,$x,$y,$z = 0;
    protected $hight = 0;
    private $size =0;

    const E = 2.7;

    abstract public function fit();
    public function setX($x)
        {
            $this->x=$x;
        }

}
//Определим интерфейс для фигур
interface Sizeable{
    const PI = 3.14;
    function setSize($scale);
}
//
interface Fitable{
    const WHITE = "FFFFFF";
    function setColor($color);
}
//Создадим конкретную сущность, удовлетворяющий вышеописанным условиям
class Rectangle extends Figure implements Sizable, Fitable{

   public function setSize($scale)
     {
           return ['witdh'=>($scale*$this->width),'hight'=>($scale*$this->hight)];
     }
   function setColor($color)
     {
           echo "Setting clor with code ".$color;
     }
}

Основные положения из этого всего.

Основные положения при создании абстрактного класса

1. Абстрактный класс и абстрактный метод создаются с помощью ключевого слова abstract;
2. Абстрактный класс обязательно должен содержать в себе хотябы один абстрактный метод;
3. Реализация абстрактного класса происходит через ключевое слово extends;
4. Класс может реализовать только один абстрактный класс;
5. Абстрактный класс, в отличии от интерфейса, может содержать реализованные методы;
6. Как и обычный класс может содержать поля, константы и методы с реализацией;
7. Абстрактные методы и поля можно объявлять с идентификаторами доступа public, protected, private и ,при реализации в классе, методы должны иметь такой же модификатор или менее ограниченный;
8. Абстрактные методы должны быть указаны явно через ключевое слово abstract;
9. При наследовании все методы, помеченные как абстрактные, должны быть реализованы в классе -потомке и ,при этом , область видимости этих методов должна совпадать (или быть менее строгой);
10. Сигнатуры , реализуемых в классе-потомке, методов должны совпадать, т.е. контроль типов и количество обязательных аргументов должно быть одинаковым;
11. Если в дочернем классе указан необязательный параметр, которого нет в сигнатуре абстрактного класса, то в данном случае конфликта сигнатур не будет. Это правило также применяется к конструкторам начиная с версии PHP 5.4. Это говорит о том, что, если в абстракции у нас метод с 2-мя аргументами, то в наследуемом классе мы можем переопределить этот метод с двумя аргументами или добавить еще, но никак не меньше;
12. Нельзя создать экземпляр или объект абстрактного класса;
13. Методы, объявленные как абстрактные не могут не могут нести реализацию , они имеют только опистельный смысл и должны быть обязательно реализованы в классе наследующим абстракцию;

Основные положения при создании интерфейса

1. Класс не может реализовать 2 интерфейса, у которых одинаковые методы ибо возникнет неоднозначность вызова;
2. Интерфейсы могут быть унаследованы друг от друга, так же как и классы, с помощью оператора extends;
3. Сигнатуры(т.е. количество передаваемых переменных и название метода) методов в классе, реализующем интерфейс, должны точно совпадать с сигнатурами, используемыми в интерфейсе, в противном случае будет вызвана фатальная ошибка;
4. Интерфейсы могут содержать константы. Константы интерфейсов работают точно так же, как и константы классов, за исключением того, что они не могут быть перекрыты наследующим классом или интерфейсом, иначе говоря не могут быть переопределены;
5. Все методы интерфейса, по умолчанию, являются абстрактными;
6. Все методы интерфейса, по умолчанию, являются публичными;
7. Интерфейс не может реализовать содержащиеся в нем методы, реализует наследующий класс;
8. Класс может наследовать интерфейс через ключевое слово implements;
9. Класс может реализвовать и наследовать несколько интерфейсов через запятые и названия интерфейсов;
10. Класс, реализующий интерфейс, должен обязательно реализовать код для всех методов наследуемого интерфейса;

2. Инсталяция Yii фреймворка на локальный сервер и запуск демо-сайта

👁 271 просмотров

Итак. В прошлой статье   мы разбирали что такое фреймворк. Настал момент, когда уже пришло этот фреймворк «попробовать на зуб». В этом уроке мы детально опишем как настроить Yii и запустить демо-сайт, который прилагается к нему в виде стандартного примера использования MVC, данный пример служит шаблоном проектирования на Yii и вы можете на основе данного примера построить свой проект. В конце урока я выложу скринкаст с YouTube, чтобы наглядно показать сей процесс 🙂 .

В первую очередь, вам необходимо установить Apache сервер интерпретатор PHP 5 или выше, в данном уроке я считаю, что он у вас установлен, если нет, то  чтобы не затягивать процесс с настройками отдельных модулей( Apache, PHP и MySQL), советую вам установить комплект уже готовой сборки на примере Denwer или, что еще лучще и рекомендую —OpenServer.

Оба пакета бесплатные и еще, чтобы запускать команды PHP интерпретатора через командную строку вам необходимо будет указать в перeменных средах путь к php.ini, у OpenServer она находится в директории C:\OpenServer\userdata\config\PHP-5.5.4_php.ini, конечно же, если вы установили так же, как и я в корень диска C. Чтобы прописать в Path откройте следующую цепочку: Пуск -> Компьтер + левой кнопуи мыши щелчок -> свойства -Дополнительные параметры системы -> перменные среды, выбираем Path +изменить и добавляем через ; путь  C:\OpenServer\userdata\config\PHP-5.5.4_php.ini:

 

perem-sredy-php-yii-inst

 

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

2. Создаем на локальном сервере хост с новым доменным именем, к примеру, я назвался у себя как websofter.loc, и кидаем туда все содержимое архива архива, прямо в корень;

3. Теперь нам надо проинсталировать наш фреймворк и для этого нам будет необходимо выполнить файл yiic , который находится в папке C:\OpenServer\domains\WebSofter.loc\yii\framework и для этого заходим в командную строку и переходим в папку C:\OpenServer\domains\WebSofter.loc\yii\framework, выполнив команду:


>cd C:\OpenServer\domains\WebSofter.loc\yii\framework

perem-sredy-php-yii-cmd

4. Перешли в папку и теперь надо набрать команду php и запустить файл инсталяции yiic и указать папку, куда надо инсталлировать, а инсталлировать мы будем в корневую папку и для этого укажем в параметре путь C:\OpenServer\domains\WebSofter.loc, команда такая:

C:\OpenServer\domains\WebSofter.loc\yii\framework> php -f yiic webapp C:\OpenServer\domains\WebSofter.loc

после этого вам будет уведомление об установке примера, вы жмете yes и после успешно установки будет вот такое окно:

perem-sredy-php-yii-succefull

5. Все!  Процедура установки окончена и чтобы проверить работоспособность сайта откройте свой адрес локального хоста и у вас должен запуститься демо-сайт:

perem-sredy-php-yii-site

И все это можете еще подробно просмотреть на виде:

Удачной установки! 🙂

1. Введение в фрэймфоркинг

👁 76 просмотров

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

 

Фреймворк  — образовано от 2-х слов, английских — frame и work, что значит, при переводе, рабочая структура или рабочий каркас, на котором основывается весь процесс проектирования, играя роль кирпичиков, дверей, окон, черепицы и т.д.

Фреймворк преследует 2 главные цели:

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

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

 

Следует отметить, что CMS — ЭТО НЕ ЕСТЬ ФРЕЙМВОРК! CMS проектируется на основе фреймворка, если образно, то CMS от WordPress и CMS от Joomla , можно построить на едином фреймворке и отличия у них будут только в CMS, основа единой и если изменить какой-то метод в классе фреймворка, то эти изменения коснутся и обеих CMS. CMS — это уже готовая платворма управления контентом через  интерфейс, для понимания которого не обязательно иметь навыки программирования.

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

 

В основе всего лежит язык программирования, неважно какой -PHP, C++, Java …, дальше уже идет парадигма ООП, которая специфична для каждого языка, дальше на сонове ООП строится фреймворк в котором реализуются весь набор минимальный операций, которые в дальнейшем группируются в CMS, к примеру: есть у нас в фреймворке класс для операции с базой данных, класс для операции постраничного вывода и класс формы ввода текста и на основе этих 3-х классов фреймворка мы можем создать функцию поиска  для CMS, когда в форму мы вводим ключевое слово, класс БД, на основе кл. слова выбирает данные, а класс постраничной навигации выводит всю эту информацию в удобный для читателя вид и эти три класса универсальны, они используются не только в поиске, но и при выводе постов блога, при вводе логина и пароля и т.д. В последующих постах мы подробно разберем специфику фреймворка Yii.