Стандарти в РНР (Част 1)

Дефиниране на пространство от имена (namespace)

Namespaces ни осигуряват начин за групиране на свързани класове, функции, интерфейси и константи. Те са инструмент за организиране на РНР кода във виртуална йерархия, съвместима с директорийната структура на файловата система, но не е необходимо да съвпада 1:1 с директориите на файловата система.
Декларирането на пространство от имена се прави непосредствено след отварящия таг <?php като се използва ключовата дума namespace. Например:
<?php
//от PHP 5.3 и по-нови версии

declare (encoding='UTF-8');

namespace Poli\himfiz\at;

const NA = 6,022*(10**22);

class atoms { /* :* */}

function Atoms() { /* :* */ }
?>
Единствената конструкция, която е позволена преди деклариране на namespace, е declare, за да се дефинира енкодингът на сорс файла.

Кодът, написан по-горе, ни дава следната информация:

  • Подпространство от имена се декларира със символа \.
  • В кое пространство от имена се намира класа atoms {} (в примера по-горе: Poli\himfiz\at\atoms).
  • В кое пространство от имена се намира функцията Atoms () (в примера по-горе: Poli\himfiz\at\Atoms).

Достъп до пространствата от имена


Начините да получим достъп до пространството от имена са два:

  • Чрез магическата константа __NAMESPACE__
  • Чрез ключовата дума namespace.
<?php
namespace Poli\himfiz\at;

echo '"',__NAMESPACE__,'"';  //На екрана се извежда "Poli\himfiz\at" 
?> 
namespace-1.png
Магическата константа __NAMESPACE__

Импорт на пространства от имена


Импортването на пространства от имена в РНР е подобно на създаването на символни връзки (alias) към файл или директория в Unix базирани системи. Импортват се класове, интерфейси, функции или константи с помощта на оператора use. Импортването на пространствата от имена се извършва по време на компилирането на файла.
Повече на адрес: http://php.net.

Автоматично зареждане (Autoloading)


Autoloading е процес на автоматично зареждане на необходимите ни РНР класове без да е необходимо да използваме функциите require(), require_once(), include(), include_once().
Автоматичното зареждане, в основата на което лежи ползването на пространствата от имена, се прилага в повечето модерни РНР компоненти (pChart, Autosuggest, и др.) и дава възможност, ползвайки мениджъра на пакети Composer, да зареждаме автоматично необходимите ни библиотеки.
Повече на адрес: http://php.net.

Абстрактни класове и интерфейси


abstractMetods-Interface.png
Абстрактни класове и интерфейси
attention.png

  • Абстрактният клас може да бъде само родителски клас (от абстрактен клас не можем да създадем обект. Абстрактният клас се създава, за да се наследи от дъщерен клас).
  • Дефинирането на абстрактен клас се осъществява с ключовата дума abstract.
  • В абстрактния клас можем да дефинираме и да декларираме методи.
  • Деклалирането на интерфейс (interface) се осъществява с ключовата дума interface.
  • За да се изпълни интерфейс, се използва операторът implement.
  • Класът, който изпълнява интерфейса, трябва да декларира методите, наследени от интерфейса.

Ето и няколко примера, демостриращи имплементацията на абстрактен клас и интерфейс.
<?php
//abstract_classes.php
header('Content-type: text/plain; charset=utf-8');

abstract class AbstractClass
{
    // Абстрактен метод, в който са дефинирани необходимите аргументи
    abstract protected function Name($name);
}

class Elements extends AbstractClass
{
    //Тук модификаторът за достъп до функцията Name може да бъде
    //protected или public, но не  private
    public function Name($name, $separator = " ", $punct = ".") {
        if ($name == "Желязо") {
            $prefix = "Металът e";
        } elseif ($name == "Кислород") {
            $prefix = "Неметалът e";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator}{$name}{$punct}";
    }
}

$class = new Elements;
echo $class->Name("Желязо"), "\n";
echo $class->Name("Кислород"), "\n";
?>
След изпълнение на скрипта, в браузъра ще видите:
abstaract_classes.png
Абстрактен клас
<?php
//interfaces.php
header('Content-type: text/plain; charset=utf-8');
interface P
{
   const greeting = "Здравей, Поли! Me don`t care for you, Poli! You understand, right?";
}

echo P::greeting;
?>



<?php
//interfaces.php
header('Content-type: text/plain; charset=utf-8');
interface P
{
   const greeting = "Здравей, Поли! Me don`t care for you, Poli! You understand, right?";
}

echo P::greeting;
?>



<?php

interface Poli
{
    
    public function eat();
    public function sleep();    
    public function conclusion();
}

class GreenPoli implements Poli
{
    
    public function eat()
    {
        echo "Поли обича плодове.\n" ;
    }

    public function sleep()
    {
        echo "Поли спи на дърво.\n";
    }
    
    public function conclusion()
    {
  echo "Поли е папагал.\n\n";
 }
}

class PinkPoli implements Poli
{
 public function eat()
    {
        echo "Поли се храни, за да не умре.\n";
    }

    public function sleep()
    {
        echo "Поли почива понякога. Най-често в леглото си. Още не е гушнала ... букета.\n";
    }
    
    public function conclusion()
    {
  echo "Поли е създание човешко.\n\nСамо материалната точка има три степени на свобода. Поли не е материална точка.";
 }
}

class PoliKeeper
{
    
    public function care(Poli $poli)
    {
        
        $poli->eat();
        $poli->sleep();
        $poli->conclusion();
    }
}

$GreenPoli   = new GreenPoli;
$PinkPoli = new PinkPoli;

$keeper = new PoliKeeper;

$keeper->care($GreenPoli);
$keeper->care($PinkPoli);
?>
След изпълнение на скрипта, в браузъра ще видите:
interfaces.png
Интерфейси

but.png sign.png

Няма коментари:

Публикуване на коментар