Namespaces (vanaf PHP 5.3)

Een grote toevoeging aan PHP 6 zijn de namespaces. Op dit moment heb je namelijk vaak het probleem dat 2 verschillende frameworks of pakketten dezelfde class-namen hebben. Bijvoorbeeld allebei Date. Dan krijg je een dikke error en dat is een probleem. Daarnaast heb je nu vaak lange class-namen, kijk maar naar Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive in het Zend Framework. Java lost dit op met packages en C++ met namespaces. Je kunt een class laten vallen onder een bepaalde namespace en zal dan die namespace moeten "importeren" (gebruiken) om de class elders aan te roepen.

Voorbeeld:

include.php:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
namespace foonamespace;

class Foobar
{
    public $foobar;    
}


?>


uitvoeren.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
require 'include.php';

$inst = new Foobar;
$inst->foobar = 'foobar';
echo $inst->foobar;
?>


Resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Fatal error: Class 'Foobar' not found in C:\server\www6\uitvoeren.php on line 4


De reden van deze error is dat PHP nu alleen kijkt binnen de huidige namespace (default namespace want ik heb in uitvoeren.php geen namespace aangegeven). Als ik echter dit doe, dan werkt het wel:

nieuwe uitvoeren.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
namespace foonamespace;
require 'include.php';

$inst = new Foobar;
$inst->foobar = 'foobar';
echo $inst->foobar;
// output: foobar
?>


Deze manier is alleen niet helemaal de bedoeling. Je moet classes die in hetzelfde pakket vallen onder dezelfde namespace gooien. Als je dan zo'n class elders wil gebruiken doe je het gewoon zo:

uitvoeren.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
require 'include.php';

$inst = new foonamespace::Foobar;
$inst->foobar = 'foobar';
echo $inst->foobar;
?>


Let op de foonamespace::. Daarmee geef ik aan dat de class Foobar zich begeeft in de namespace foonamespace (zoals aangegeven in include.php).

Je kunt zo ook meerdere lagen diep gaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
namespace PHPhulp::Database;

class SQLstatements
{
    // iets;
}
?>


Deze class kun je dan weer later aanroepen met PHPhulp::Database::SQLstatements.

Namen korter maken
PHPhulp::Database::SQLstatements is nog steeds vrij lang, dus dat moet korter! Daar heb je de use-operator voor gekregen:

include.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
namespace PHPhulp::Database;

class SQLstatements
{
    // iets;
}
?>


uitvoeren.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
use PHPhulp::Database as PHP_DB;

$inst = new PHP_DB::SQLstatements();
// etc
?>


Het PHP team heeft de operator use in eerste instantie import genoemd, maar later toch herzien naar use. Dit komt omdat import al veel wordt gebruikt als functienaam in bestaande scripts, en het nu een reserved keyword moet worden. Dat zou betekenen dat veel bestaande scripts errors gaan opleveren. En het PHP team heeft use al reserved gemaakt vanaf PHP 5 door een foutje, waardoor de upgrade van PHP 5 naar PHP 6 geen problemen kan opleveren met de use-operator (hij is namelijk al reserved).

Let op: namespace-declaraties moeten helemaal bovenaan in het document.

Bedoeling
De bedoeling is dus dat je classes binnen hetzelfde pakket in dezelfde namespace zet. Bij een framework kun je subonderdelen in subnamespaces zetten met Hoofd::Sub en die aanroepen met Hoofd::Sub::Class (of een afkorting met use). Zo creëer je packages en heb je geen botsingen meer met class-namen en je hebt geen lange class-namen meer, je hoeft ze namelijk slechts bovenaan je document te importeren en verder kun je de afkorting gebruiken. Problemen opgelost.

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Installatie PHP 6 naast PHP 5
  2. Inleiding
  3. Bye@ Register_globals, magic_quotes, mysql_query()
  4. Namespaces (vanaf PHP 5.3)
  5. Label en goto
  6. Verkorte ifsetor() (vanaf PHP 5.3)
  7. Static keyword (vanaf PHP 5.3?)

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.