PHP.nl

Namespaces and dynamic language features

Namespaces en dynamische taalfeatures

PHP's implementatie van namespaces is beïnvloed door de dynamische aard van de programmeertaal. Om code zoals het volgende voorbeeld om te zetten naar namespaced code:

Moet men de volledig gekwalificeerde naam gebruiken (klasnaam met namespace-prefix). Merk op dat er geen verschil is tussen een gekwalificeerde en een volledig gekwalificeerde naam binnen een dynamische klassenaam, functienaam of constante naam, de leidende backslash is niet nodig.

Voorbeeld: Dynamisch toegang krijgen tot elementen

example1.php:

<?php
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>

Voorbeeld: Dynamisch toegang krijgen tot namespaced elementen

<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";

/* let op dat als je dubbele aanhalingstekens gebruikt, "\\namespacename\\classname" moet worden gebruikt */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // prints namespaced
?>

Zorg ervoor dat je de opmerking over het ontsnappen van namespace-namen in strings leest.

Documentatie