I agree with SR, the new namespaces feature has solved a number of problems for me which would have required horrible coding to solve otherwise.
An example use:
Say you are making a small script, and write a class to connect to a database, calling it 'connection'. If you find your script useful and gradually expand it into a large application, you may want to rename the class. Without namespaces, you have to change the name and every reference to it (say in inheriting objects), possibly creating a load of bugs. With namespaces you can drop the related classes into a namespace with one line of code, and less chance of errors.
This is by no means one of the biggest problems namespaces solve; I would suggest reading about their advantages before citicising them. They provide an elegant solutions to several problems involved in creating complex systems.
Definição de Namespace
O namespace é declarado usando a palavra chave namespace, que deve ser usada logo no começo do arquivo. Exemplo:
Exemplo #1 Defining namespace
<?php
namespace MyProject::DB;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
Um mesmo nome de namespace pode ser usado em múltiplos arquivos.
Namespace pode conter definições de classes, constantes e funções, mas não código livre.
Definição do Namespace fazem seguinte:
- Dentro do namespace, todas os nomes de as classes, funções e constantes na definição são automaticamente prefixados com o nome do namespace. O nome da classe é sempre o nome completo, i.e. no exemplo acima a classe é chamada MyProject::DB::Connection.
- Definição de constantes criam constantes que são compostas do nome do namespace e o nome da constante. Com constantes de classes, constantes do namespace podem somente conter valores estáticos.
-
Nome não qualificado de classe (i.e., nome não contém ::) são resolvido em runtime seguindo este procedimento:
- A classe é verificada dentro do atual namespace (i.e. prefixando o nome com o atual nome do namespace) sem tentar fazer autoload.
- A classe é verificada dentro do namespace global sem tentar fazer autoload.
- É tentado autoloading para nomes no namespace atual.
- Se anteriormente falhou, a verificação falha.
-
Nome não qualificado de função (i.e., nome não contém ::) é verificado em tempo de execução primeiro no namespace atual e então no espaço global.
-
Nome de constantes não qualificada são verificadas primeiro no namespace atual e então entre as constantes globalmente definidas.
Veja também em regras de resolução de nomes.
Definição de Namespace
07-Sep-2008 05:56
14-May-2008 12:47
There is nothing wrong with PHP namespaces, except that those 2 instructions give a false impression of package management.
... while they just correspond to the "with()" instruction of Javascript.
By contrast, a package is a namespace for its members, but it offers more (like deployment facilities), and a compiler knows exactly what classes are in a package, and where to find them.
01-Apr-2008 12:11
@ RS: Also, you can specify how your __autoload() function looks for the files. That way another users namespace classes cannot overwrite yours unless they replace your file specifically.
