php[world] 2015 Schedule Announced

Definir varios espacios de nombres en un mismo fichero

(PHP 5 >= 5.3.0)

También se pueden declarar varios espacios de nombres en un mismo fichero. Se permiten dos tipos de sintaxis.

Ejemplo #1 Declarar varios espacios de nombres, sintaxis de combinación simple

<?php
namespace MiProyecto;

const 
CONECTAR_OK 1;
class 
Conexión /* ... */ }
function 
conectar() { /* ... */  }

namespace 
OtroProyecto;

const 
CONECTAR_OK 1;
class 
Conexión /* ... */ }
function 
conectar() { /* ... */  }
?>

No se recomienda esta sintaxis para combinar espacios de nombres en un único fichero. En su lugar, se recomienda emplear la sintaxis de llaves alternativa.

Ejemplo #2 Declarar varios espacios de nombres, sintaxis de llaves

<?php
namespace MiProyecto {

const 
CONECTAR_OK 1;
class 
Conexión /* ... */ }
function 
conectar() { /* ... */  }
}

namespace 
OtroProyecto {

const 
CONECTAR_OK 1;
class 
Conexión /* ... */ }
function 
conectar() { /* ... */  }
}
?>

Se desaconseja completamente, como práctica de código, la combinación de varios espacios de nombres en un mismo fichero. El caso de uso principal es combinar varios scripts de PHP en el mismo fichero.

Combinar código global que no es de espacio de nombres con código que sí lo es, sólo está soportado mediante la sintaxis de llaves. El código global debería estar encerrado en una declaración de espacio de nombres sin nombre de espacio de nombres:

Ejemplo #3 Declarar múltiples espacios de nombres y código que no es de espacio de nombres

<?php
namespace MiProyecto {

const 
CONECTAR_OK 1;
class 
Conexión /* ... */ }
function 
conectar() { /* ... */  }
}

namespace { 
// código global
session_start();
$a MiProyecto\conectar();
echo 
MiProyecto\Conexión::iniciar();
}
?>

No puede existir código de PHP fuera de las llaves del espacio de nombres, excepto para una sentencia de apertura 'declare'.

Ejemplo #4 Declarar varios espacios de nombres y código que no es de espacio de nombres

<?php
declare(encoding='UTF-8');
namespace 
MiProyecto {

const 
CONECTAR_OK 1;
class 
Conexión /* ... */ }
function 
conectar() { /* ... */  }
}

namespace { 
// código global
session_start();
$a MiProyecto\conectar();
echo 
MiProyecto\Conexión::iniciar();
}
?>

add a note add a note

User Contributed Notes 7 notes

up
5
Rahul Sonar
4 months ago
<?php
//Namespace can be used in this way also
namespace MyProject {

function
connect() { echo "ONE";  }
   
Sub\Level\connect();
}

namespace
MyProject\Sub {
   
function
connect() { echo "TWO";  }
   
Level\connect();
}

namespace
MyProject\Sub\Level {
   
    function
connect() { echo "THREE";  }   
    \
MyProject\Sub\Level\connect(); // OR we can use this as below
   
connect();
}
up
3
jigar dot vy at gmail dot com
7 days ago
<?php

// You cannot mix bracketed namespace declarations with unbracketed namespace declarations - will result in a Fatal error

namespace a;

echo
"I belong to namespace a";

namespace
b {
    echo
"I'm from namespace b";
}
up
52
kothnok at gmail dot com
3 years ago
"use" statements are required to be placed after the "namespace my\space" but before the "{".
e.g.

<?php
namespace foo\bar;
use
my\space\MyClass;
{

// place code here

} // end of namespace foo\bar

namespace another\bar;
use
my\space\MyClass;
use
my\space\AnotherClass;
{

// place code here

} // end of namespace another\bar
?>
up
23
leaksin [ at ] gmail [ dot ] com
1 year ago
using of global namespaces and multiple namespaces in one PHP file increase the complexity and decrease readability of the code.
Let's try not use this scheme even it's very necessary (although there is not)
up
1
Ishan Fernando
6 days ago
//call same named function using namespace

//food.php

<?php
namespace Food;

require (
'Apple.php');
require(
'Orange.php');

use
Apples;
use
Oranges;

 
Apples\eat();
 
Oranges\eat();
?>

//Apple.php
<?php
namespace Apples;

function
eat()
{
  echo
"eat apple";
}
?>

//Orange.php
<?php
namespace Oranges;

function
eat()
{
  echo
"eat Orange";
}
?>
up
0
Luis Pessoa
2 months ago
Be careful with include combined to namespaces:

file b.php
<?php
   
const WHERE_I_AM = 'I am in B';
   
    function
i_am_in() {
        \
A\cr_echo(WHERE_I_AM);
    }
?>

file c.php
<?php
   
namespace C {
        const
WHERE_I_AM = 'I am in C';
       
        function
i_am_in() {
            \
A\cr_echo(WHERE_I_AM);
        }
    }
?>

main file

<?php
  
   
namespace A {
   
        const
CR = "\r\n";
        const
WHERE_I_AM = 'I am in A';
       
        function
cr_echo($msg) {
            echo
$msg . CR;
        }
       
        function
i_am_in() {
           
cr_echo(WHERE_I_AM);
        }
    }
   
    namespace
B {
        require
'b.php';
    }
   
    namespace {
        require
'c.php';
       
        \
A\i_am_in(); //ok
       
\B\i_am_in(); // fatal-error
       
\C\i_am_in(); //ok
   
}
?>
up
-92
1932 at bk dot ru
1 year ago
last two examples give:

Fatal error: Call to undefined method MyProject\Connection::start() in Z:\home\test1.ru\www\link.php on line 12
To Top