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).
Достъп до пространствата от имена
Начините да получим достъп до пространството от имена са два:
Импортването на пространства от имена в РНР е подобно на създаването на символни връзки (alias) към файл или директория в Unix базирани системи.
Импортват се класове, интерфейси, функции или константи с помощта на оператора use. Импортването на пространствата от имена се извършва по време на компилирането на файла.
Повече на адрес: http://php.net.
Автоматично зареждане (Autoloading)
Autoloading е процес на автоматично зареждане на необходимите ни РНР класове без да е необходимо да използваме функциите require(), require_once(), include(), include_once().
Автоматичното зареждане, в основата на което лежи ползването на пространствата от имена, се прилага в повечето модерни РНР компоненти (pChart, Autosuggest, и др.) и дава възможност, ползвайки мениджъра на пакети Composer, да зареждаме автоматично необходимите ни библиотеки.
Повече на адрес: http://php.net.
Абстрактни класове и интерфейси
Абстрактни класове и интерфейси
Абстрактният клас може да бъде само родителски клас (от абстрактен клас не можем да създадем обект. Абстрактният клас се създава, за да се наследи от дъщерен клас).
Дефинирането на абстрактен клас се осъществява с ключовата дума 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";
?>
След изпълнение на скрипта, в браузъра ще видите:
Абстрактен клас
<?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);
?>
След изпълнение на скрипта, в браузъра ще видите:
Интерфейси
Няма коментари:
Публикуване на коментар