Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola pessoal eu estou estudando PHP-OO por um livro (PHP Programando com Orientação a Objetos), em um capitulo ele faz demonstrações de como "gerar" HTML e CSS com php-OO. por exemplo: TElement.class.php <?php
/** classe TElement classe para abstração de tags HTML */
class TElement
{ private $name. // nome da TAG private $properties. // propriedades da TAG
protected $children. /** * método construtor * instancia uma tag html * @param $name = nome da tag */ public function __construct($name) { // define o nome do elemento $this->name = $name. } /** * método __set() * intercepta as atribuições à propriedades do objeto * @param $name = nome da propriedade * @param $value = valor */ public function __set($name, $value) { // armazena os valores atribuídos // ao array properties $this->properties[$name] = $value. } /** * método add() * adiciona um elemento filho * @param $child = objeto filho */ public function add($child) { $this->children[] = $child. } /** * método open() * exibe a tag de abertura na tela */ private function open() { // exibe a tag de abertura echo "<{$this->name}". if ($this->properties) { // percorre as propriedades foreach ($this->properties as $name=>$value) { echo " {$name}=\"{$value}\"". } } echo '>'. } /** * método show() * exibe a tag na tela, juntamente com seu conteúdo */ public function show() { // abre a tag $this->open(). echo "\n". // se possui conteúdo if ($this->children) { // percorre todos objetos filhos foreach ($this->children as $child) { // se for objeto if (is_object($child)) { $child->show(). } else if ((is_string($child)) or (is_numeric($child))) { // se for texto echo $child. } } // fecha a tag $this->close(). } } /** * método close() * Fecha uma tag HTML */ private function close() { echo "</{$this->name}>\n". }
}?> TStyle.class.php <?php public function __construct($name) { // atribui o nome do estilo $this->name = $name. } /** * método __set() * intercepta as atribuições à propriedades do objeto * @param $name = nome da propriedade * @param $value = valor */ public function __set($name, $value) { // substitui o "_" por "-" no nome da propriedade $name = str_replace('_', '-', $name). // armazena os valores atribuídos ao array properties $this->properties[$name] = $value. } /** * método show() * exibe a tag na tela */ public function show() { // verifica se este estilo já foi carregado if (!isset(self::$loaded[$this->name])) { echo "<style type='text/css' media='screen'>\n". // exibe a abertura do estilo echo ".{$this->name}\n". echo "{\n". if ($this->properties) { // percorre as propriedades foreach ($this->properties as $name=>$value) { echo "\t {$name}: {$value}. \n". } } echo "}\n". echo "</style>\n". // marca o estilo como já carregado self::$loaded[$this->name] = TRUE. } }
}?> index.php <?phpinclude_once 'TElement.class.php'. include_once 'TStyle.class.php'. // cria um estilo$style = new TStyle('estilo_texto'). $style->color = '#FF0000'. $style->font_family = 'Verdana'. $style->font_size = '20pt'. $style->font_weight= 'bold'. $style->show(). // instancia um parágrafo$texto= new TElement('p'). $texto->align = 'center'. $texto->add('Sport Club Internacional'). // define o estilo do parágrafo$texto->class = 'estilo_texto'. $texto->show().?> e o resultado disso tudo é: Sport Club Internacional Então a minha duvida é: Dessa forma que o livro esta fazendo realmente é a melhor forma de se trabalhar com PHP_OO, HTML e CSS, fazendo o PHP gerar tudo?.ObrigadoClayder, bom dia.
Na minha opinião, a resposta para sua pergunta é: Depende.
Uma abordagem dessas, utilizando PHP para gerar elementos HTML faz mais sentido se a GUI é baseada em componentes e gerada pelo próprio programador, visto que um webdesigner ou programador front-end ( js+html+css ) nem sempre terá o conhecimento necessário para manipular os objetos.
A abordagem, entretanto, faz sentido se for para implementar uma GUI de um ERP por exemplo ( Inclusive, só para efeito de curiosidade, o Pablo, autor do livro, lançou um framework recentemente justamente com esse intuito ).
Observações:
- Já tive esse livro e, se não me engano, esse exemplo de código está em um capítulo sobre a utilização do design pattern *Composite*, então, o ideal é se concentrar nos conceitos teóricos ensinados, mesmo que nem sempre seja possível utilizar tais exemplos na prática exatamente como são mostrados;
- Não gosto de marcar as propriedades **$name** e **$properties** como *private*. Ao meu ver, faz muito sentido estender TElement e, portanto, marcar propriedades como *protected*;
-
No método add, eu usaria type hinting, algo como:
...
public function add(TElement $child)
{
$this->children[] = $child;
}
...
- Lembrando que eu poderia ter uma classe TTextElement que estenderia de TElement e serviria para Elementos de texto, não sendo necessário utilizar funções como **is_object**, **is_string** e **is_numeric** dentro do método **show**;
-
Usar o método __toString faria total sentido no lugar do método open. Claro, neste caso, em vez de dar echo dentro do método, o conteúdo do elemento poderia ser guardado numa propriedade buffer, por exemplo. Então, em vez de chamar:
$texto->show();
Você poderia utilizar:
print $texto;
- Novamente, o importante é se apegar aos conceitos teóricos ensinados no livro, no entanto, só para registro, há uma extensão de manipulação DOM no PHP ( [http://php.net/manual/pt_BR/book.dom.php](http://php.net/manual/pt_BR/book.dom.php) ) que faz todo o trabalho de manipular elementos XML - e HTML - de forma bem competente;
Bom, acho que é isso. Desculpe-me pelo texto enorme.
Grande abraço. :thumbsup:
Problemas com essa abordagem:
PHP é a sigla para HTML Preprocessor, o que significa que você deve adicionar PHP ao HTML, não o contrário.
Dependendo da situação vale a pena abstrair o HTML. Sugiro uma leitura deste tópico:
http://forum.imasters.com.br/topic/402287-resolvidovale-a-pena-usar-templates/
É complicado responder, já que desta forma que você está fazendo com certeza fazer uma manutenção, integrar a algum framework ou qualquer coisa do tipo fica mais fácil, mas vai haver mais processamento por parte do servidor, portanto eu não usaria para gerar coisas simples como <p> ou tags de titulo (h1,h2,h3...) ou mesmo tag title, mas para gerar links e formulários é bem bacana, outra coisa é a forma como é chamado, seria legal facilitar para o desenvolvedor frontend, então se ele setar as configurações via array seria mais bacana do que chamar um monte de funções...
Espero ter ajudado.