Kako napisati PHP aplikaciju bez ijednog includa?

includesInclude i require funkcije služe za priključenje drugih skriptova i nezamislivo je da napišete kod, a da ni jednom ne napišete include “path/to/file.php”. Međutim,  PHP je u verziji 5.3, napokon, predstavio namespace-ove, odnosno način grupisanja klasa, funkcija i konstanti. I ako je osnovna namena namespaceova u PHP-u da da se izbegne koalizija oko istih naziva klasa ili funkcija i da poveća čitljivost i razumljivost koda, namespaceovi se mogu iskoristiti i u svrhu automatskog učitavanja klasa.

Potrebno je da vaša aplikacija poštuje samo jednu stvar – putanja do klase mora biti ista kao namespace kojoj ta klasa pripada. Ko poznaje Javu i razume sistem paketa, sve će mu biti jasno.

Ukoliko imate klasu User, sa putanjom:

/controllers/users/User.php

ta klasa bi trebala bi ima sledeći namespace:

namespace controllers\users;

i u uprošćenoj verziji izgledala bi ovako:

<?php
namespace controllers\users;

class Users
{
    private $user;
    function __construct() { ... }
    function showUserPage() { ...}
    function showUsersSettings() { ...}
}
?>

Ukoliko bi želeli ovu instanciramo ovu klasu, sa automatskim učitavanjem, recimo u index.php skriptu, takav skript bi izgledao ovako:

<?php
define("ROOT", realpath(__DIR__));
set_include_path(get_include_path().PATH_SEPARATOR.ROOT);
spl_autoload_extensions('.php');
spl_autoload_register();

$user = new \controllers\users\User();

?>

Vrlo zgodno zar ne? Nastaviću sa ovim primerom i pokazati kako namespace može biti još korisniji. Recimo i da je ovoj našoj klasi User potreban model korisnika, odnosno klasa /models/users/User.php, u standardnom sistemu, bez korišćenja namespacova bi morali da je preimenujemo u nešto drugo, npr ModelUser.php, da ne bi došlo do koalizije. Ali u ovom našem, možemo vrlo jednostavno instancirati model korisnika, npr u konkstruktoru:

function __construct() {
    $this->user = \model\users\User();
}

Još zgodnija stvar bi bila kada bi koristili aliase za namespaceove, pa tako možemo na početku User klase definisati da on koristi klasu models\users\User kao UserModel. Ovo je naročito bitno kada je se klasa nalazi na dubljem nivou:

use \models\users\User as UserModel;
....
$this->user = UserModel();

That’s all folks!

3 Comments

  1. Koristis neki framework?

  2. Povremeno, CI.
    Video sam tvoj tweet na ovu temu za korišćenje fw-a. To stoji i ima prednost kada hoćeš samo da završiš posao, ali ima nas koji volimo da istražujemo nove stvari i pravimo sami svoje frameworke 🙂

  3. Pa fw koristis NAKON sto dobro istrazis stvari :p
    Salim se, ima prednosti i to ako pravis sopstveni fw al’ ne treba se ponavljati, ako vec pronadje fw koji ti odgovara, medjutim, neki su preobimni i brzina izvrsavana im nije najjaca strana, al’ CI je definitivno elegantant, nije prenatrpan suvisnim stvarima i dobro implementira MVC koncept.

Comments are closed.