Este artigo é uma continuação da explicação do uso da função __autoload , só que neste utilizando namespaces.
Bem, como vimos a utilização do recurso de autoload, agora vou adequar os arquivos do post anterior p/ poder utilizar o recurso de namespaces. Pode parecer um pouco confuso até pegar o jeito, mas vale a pena. Esse novo conceito necessita de organização e algumas dicas q eu dou são:Importantes:
1 - que vc utilize os namespaces de acordo com sua estrutura física de arquivos e pastas.Evite perda de tempo e confusões desnecessárias
2 - que vc dê uma boa lida nesses links :
- namespaces
- static
- spl
3 - que você aceite o novo padrão de implementação que está sendo pedido, e esqueça o jeito procedural de fazer as coisas. Daqui para frente pense sempre em OOP, Classes , Reutilização de Código;
4 - que antes de sair codificando alguma coisa, verifique se já existe alguma design pattern para o seu problema;
5 - Veja na documentação fornecida pelo fabricante ou mantenedor os modelos exemplos fornecidos. Penso que ninguém melhor para mostrar o melhor uso. No caso do php o site do PHP , da ORACLE e da IBM são boas referências;
Opcionais:
6 - Se possível faça um modelo UML antes do sistema, existem diversas ferramentas que facilitam criar os diagramas e uns até exportam o diagrama p/ código fonte (C,C++,PHP,JAVA,etc..), eu gosto do Astah
7 - Se vc quiser usar um esquema automágico no carregamento de classes, utilize sempre o mesmo esquema nos nomes de arquivos ou tudo.php ou tudo .class.php, no exemplo anterior eu mostrei um jeito semi-automático criando um array com os nomes das classse (aí pode utilizar qualquer nome, pois o mapeamento será manual, p/ pequenas aplicações não tem problema), e caminho dentro de uma função __autoload .
Nesse esquema a função spl_autoload_register já faz isso.
8- Utilize uma IDE p/ desenvolver, Netbeans, Eclipse, Dreamweaver, tanto faz. e utilize uma ferramenta que gere documentação de seu código. Isso permite analisar mais fácilmente o que já foi implementado e o que falta.
9- Quando achar que já sabe o bastante, continue pesquisando, as tecnologias são dinâmicas e requerem sempre atualizações ou melhorias.Penso que sempre existirá um jeito mais rápido de se fazer algo que já está sendo feito, depende do ponto de vista e da experiência do desenvolvedor.
Vamos ao namespaces :
1- Introdução namespaces
Antes de mostrar o projeto final, vou mostrar um exemplo simples p/ facilitar o entendimento ainda utilizando uma função __autoload():Observe que quando vc quiser usar o comando use .. . a classe deve ter na 1ª linha uma definição de namespace p/ ser acessível.
E a definição namespace na classe que vc quer disponilizar o acesso.
/test/Foo.php este com namespace tests
<?php namespace tests; class Foo { public function __construct() {} public function sayHello() { echo 'Hello <br>'; $dt = new \DateTime(); } public static function sayBye() { echo 'Bye '; } public static function init() {} }?>
/autoload.php sem utilizar declaração namespace
<?php function __autoload($classe) { echo "receiving $classe<br>"; $nameClassOnly = strpos(strrev($classe), "\\"); $classeAux = substr($classe, -$nameClassOnly); echo "would be $classeAux??<br>"; $finalClass = str_replace('\\', '/', $classe); echo "including $finalClass<br>"; require_once $finalClass . '.php'; spl_autoload_register(array($classe, 'init'));//registra a classe com o metodo statico init }?>
/callFoo.php sem utilizar declaração namespace mas usando o autoload e o comando use namespace\classe
<?php require 'autoload.php'; use tests\Foo ; $foo = new Foo(); $foo->sayHello(); $dt = new DateTime(); echo $dt->format(date('d/m/Y H:i:s')) . "<br>"; //static method Foo::sayBye(); echo "<pre>"; print_r(spl_autoload_functions()); echo "</pre>";?>
resultado :
/callFoo_1.php sem utilizar declaração namespace mas usando o autoload e o comando use namespace\classe e utilizando um Alias p/ a classe Foo
<?php require 'autoload.php'; use tests\Foo as MyFooClass; $foo = new MyFooClass(); $foo->sayHello(); $dt = new DateTime(); echo $dt->format(date('d/m/Y H:i:s')) . "<br>"; MyFooClass::sayBye(); echo "<pre>"; print_r(spl_autoload_functions()); echo "</pre>"; ?>
resultado :
e como fica isso mais perto da realidade sem Foo, bar, etc ?
/callCliente.php sem utilizar declaração namespace mas usando o autoload e o comando use ...
<?php require 'autoload.php'; use app\model\Cliente; use app\lib\Utils; $cliente = new Cliente(); $util= new Utils(); $util->mostraObjeto($cliente); echo "<pre>"; print_r(spl_autoload_functions()); echo "</pre>"; ?>
/app/model/Cliente.php
<?php namespace app\model; final class Cliente { private $id; private $nome; private $email; function __construct() { $this->id = 0; $this->nome = null; $this->email = null; } public static function init() { __construct(); } public function getId() { return $this->id; } public function setId($id) { $this->id = $id; } public function getNome() { return $this->nome; } public function setNome($nome) { $this->nome = $nome; } public function getEmail() { return $this->email; } public function setEmail($email) { $this->email = $email; } public function __toString() { return "id:".$this->getId()." nome:".$this->getNome()." email:".$this->getEmail(); } } ?>
/app/lib/Utils.php
<?php namespace app\lib; class Utils { private $styleBox; public static function init(){ __construct() ; } public function __construct() {} public static function mostraObjeto($object) { echo "<pre style=\" font-family: Tahoma, Geneva, sans-serif; background-color: #FFC; font-size: 9px; border: thin solid #03C; cursor: text; filter: Xray;\">"; print_r($object); echo "</pre>"; echo "<hr size=\"1\" width=\"100%\">"; } }?>Teste.
resultado
Experimente criar novas classes e usá-las, ou mover os arquivos de lugar p/ entender bem o conceito de namespace
Agora que você já entendeu o conceito de namespaces vamos a Aplicação, a idéia é fazer um CRUD dos Clientes utilizando o jQuery para realizar as operações e o PHP servir apenas como um BackEnd e DataStore , mas como já expliquei neste post como utilizar namespaces, vou começar o Post da aplicação. pois já temos o que precisamos...
Dúvidas, Contribuições, Sugestões? Poste..Grato,Até a próxima.
Nenhum comentário:
Postar um comentário