<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>O Webmaster</title>
	<atom:link href="http://owebmaster.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://owebmaster.wordpress.com</link>
	<description>W3C, CSS, xHTML, PHP, MySQL, e outras siglas!</description>
	<lastBuildDate>Sat, 06 Jun 2009 14:44:29 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='owebmaster.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/5ca433262fbfce3509b62941858e7555?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>O Webmaster</title>
		<link>http://owebmaster.wordpress.com</link>
	</image>
			<item>
		<title>Getting Real (Caindo na Real): É melhor remediar que prevenir!</title>
		<link>http://owebmaster.wordpress.com/2008/07/02/getting-real-caindo-na-real-e-melhor-remediar-que-prevenir/</link>
		<comments>http://owebmaster.wordpress.com/2008/07/02/getting-real-caindo-na-real-e-melhor-remediar-que-prevenir/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 21:40:30 +0000</pubDate>
		<dc:creator>Diego M. Quinteiro</dc:creator>
				<category><![CDATA[Sem  Categoria]]></category>
		<category><![CDATA[metodologia]]></category>
		<category><![CDATA[getting real]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://owebmaster.wordpress.com/?p=66</guid>
		<description><![CDATA[As mensagens que o livro Getting Real quer passar são das mais incomuns. Alguns dos conceitos defendidos pelo livro dos gurus da 37signals, criadores do Ruby on Rails, parecem contariar tudo o que aprendemos:

Caia na real!
Faça menos que sua concorrência e seja ágil para mudar de rumo.
Jogue fora sua bola de cristal: não perca tempo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=66&subd=owebmaster&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As mensagens que o livro <strong><em>Getting Real</em></strong> quer passar são das mais incomuns. Alguns dos conceitos defendidos pelo livro dos gurus da <a title="37signals é empresa criadora do Ruby on Rails" href="http://37signals.com">37signals</a>, criadores do <em>Ruby on Rails</em>, parecem contariar tudo o que aprendemos:</p>
<ul>
<li>Caia na real!</li>
<li>Faça menos que sua concorrência e seja ágil para mudar de rumo.</li>
<li>Jogue fora sua bola de cristal: não perca tempo hoje resolvendo problemas de amanhã &#8211; você já tem problemas suficientes hoje para se preocupar.</li>
<li>Seu projeto funcionando deve ser sua melhor e possivelmente única documentação. Não crie documentos que não viram realidade.</li>
<li>Reuniões devem ser evitadas. Quando inevitáveis, coloque o alarme do celular para 30 minutos: quando tocar, acabou a reunião.</li>
<li>Lembre-se: erros ocorrerão. Não se preocupe: é um sistema para web e não uma cirurgia de cérebro.</li>
</ul>
<p>É uma abordagem um tanto chocante que pode deixar alguns contrariados, mas que certamente acrescentará muito a todos.</p>
<p><a href="http://gettingreal.37signals.com/GR_por.php">O livro está disponível gratuitamente na íntegra, traduzido para o português como <strong>&#8220;Caindo na Real&#8221;</strong>.</a></p>
<p>Leia, é grátis!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/owebmaster.wordpress.com/66/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/owebmaster.wordpress.com/66/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owebmaster.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owebmaster.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owebmaster.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owebmaster.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owebmaster.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owebmaster.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owebmaster.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owebmaster.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owebmaster.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owebmaster.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=66&subd=owebmaster&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://owebmaster.wordpress.com/2008/07/02/getting-real-caindo-na-real-e-melhor-remediar-que-prevenir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/84c2890292749e6664dc8c7f2f75a987?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Diego M. Quinteiro</media:title>
		</media:content>
	</item>
		<item>
		<title>Mapeamento Objeto-Relacional (ORM)</title>
		<link>http://owebmaster.wordpress.com/2008/07/01/mapeamento-objeto-relacional-orm/</link>
		<comments>http://owebmaster.wordpress.com/2008/07/01/mapeamento-objeto-relacional-orm/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 18:28:09 +0000</pubDate>
		<dc:creator>Diego M. Quinteiro</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[base de dados]]></category>
		<category><![CDATA[orientação à objeto]]></category>

		<guid isPermaLink="false">http://owebmaster.wordpress.com/?p=51</guid>
		<description><![CDATA[Com o lançamento do PHP5, as esperanças de utilizar as técnicas da programação orientada à objetos (POO) no desenvolvimento de sistemas web cresceu para os adeptos da linguagem . A versão anterior do PHP já possuia recursos de orientação à objetos, mas estes eram muito limitados e alguns problemas chegavam a desencorajar seu uso. O [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=51&subd=owebmaster&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Com o lançamento do PHP5, as esperanças de utilizar as técnicas da <strong>programação orientada à objetos (POO)</strong> no desenvolvimento de sistemas web cresceu para os adeptos da linguagem . A versão anterior do PHP já possuia recursos de orientação à objetos, mas estes eram muito limitados e <a title="saiba mais neste artigo" href="http://www.criarweb.com/artigos/328.php">alguns problemas chegavam a desencorajar seu uso</a>. O PHP5 veio com um novo motor, o <em>Zend Engine 2</em>, que corrigiu esses problemas e <a title="POO no manual do PHP5" href="http://br2.php.net/manual/pt_BR/language.oop5.php">suporta a maioria dos recursos esperados de uma linguagem orientada à objetos</a>, como interfaces, métodos abstratos, herança, polimorfismo, dentre outros.</p>
<p>Apesar das linguagens modernas possuirem recursos da POO, os sistemas de gerenciamento de bases de dados (SGBD) são quase todos baseadas no <strong>modelo relacional</strong>, onde temos tabelas ao invés de objetos. E na maioria dos casos o que queremos é justamente guardar nossos objetos na base dados. Guardar instâncias de objetos em registros de tabelas é o objetivo das técnicas de mapeamento objeto-relacional (em inglês <em>object-relational mapping</em>, ORM).</p>
<p>Existem muitas <a title="artigo da wikipedia em inglês" href="http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch">diferenças entre os modelos relacional e orientado à objeto</a> e a mais incômoda delas para quem desenvolve sistemas web é que tabelas não suportam herança.</p>
<p>Considere o seguinte exemplo: temos três classes, sendo uma delas abstrata e as outras duas concretas e extendendo a primeira. Mais palpável ainda: considere uma classe abstrata <em>Pessoa</em> e as classes concretas Fornecedor e Cliente que são filhas da classe <em>Pessoa</em>.</p>
<p style="text-align:center;"><a href="http://owebmaster.files.wordpress.com/2008/07/modelo.png"><img class="size-medium wp-image-53 aligncenter" src="http://owebmaster.files.wordpress.com/2008/07/modelo.png?w=218&#038;h=245" alt="" width="218" height="245" /></a></p>
<p style="text-align:left;">Como guardar essas informações no banco de dados?</p>
<h3 style="text-align:left;">Uma tabela por classe contreta</h3>
<p style="text-align:left;">A solução mais imediata seria criar 2 tabelas, da seguinte forma:</p>
<p style="text-align:center;"><a href="http://owebmaster.files.wordpress.com/2008/07/relacional-1.png"><img class="size-medium wp-image-56 aligncenter" src="http://owebmaster.files.wordpress.com/2008/07/relacional-1.png?w=300&#038;h=82" alt="" width="300" height="82" /></a></p>
<p style="text-align:left;">Essa solução mais simples ignora completamente a hierarquia de classes e faz uma tabela por classe concreta sem relacionamentos.</p>
<ul>
<li>Prós:
<ul>
<li>Todos os dados de um objeto estão em uma só tabela, facilitando a manipulação.</li>
<li>Buscas serão executadas de forma rápida.</li>
<li>Não há campos nulos.</li>
</ul>
</li>
<li>Contras
<ul>
<li>Dificulta alterações na classe pai, pois os campos estão duplicados (ou triplicados, quadruplicados&#8230;).</li>
<li>Pode ser um grande problema se houver alguma classe com referência para a classe pai (veja próximo exemplo).</li>
</ul>
</li>
</ul>
<p>Em alguns casos talvez essa seja uma boa solução. Não é o caso se houver uma referência para a classe pai, como por exemplo:</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-57" title="UML - Referência à classe pai" src="http://owebmaster.files.wordpress.com/2008/07/modelo-2.png?w=450&#038;h=263" alt="UML - Referência à classe pai" width="450" height="263" /></p>
<p>Nesse caso a nossa primeira solução falha, pois não existe uma forma de relacionar Mensagem com Pessoa sem explicitar se é um Fornecedor ou um Cliente. Poderíamos claro, usar a chave estrangeira de todas as subclasses, mas isso seria um pesadelo no caso de muitos relacionamentos e/ou muitas subclasses. Precisamos de uma solução melhor.</p>
<h3>Uma tabela por árvore de classes</h3>
<p>Podemos utilizar 1 só tabela para todas as subclasses de <em>Pessoa</em>, solucionando o problema anterior:</p>
<p><a href="http://owebmaster.files.wordpress.com/2008/07/relacional-2.png"><img class="aligncenter size-full wp-image-58" src="http://owebmaster.files.wordpress.com/2008/07/relacional-2.png?w=450&#038;h=114" alt="" width="450" height="114" /></a></p>
<p>Nesta solução temos 1 tabela para cada árvore de classes. O campo <em>tipo</em> irá determinar se o registro é um Cliente ou Fornecedor. O campo <em>endereço</em> ficará nulo no caso dos clientes e o campo <em>telefone</em> ficará nulo no caso dos fornecedores.</p>
<ul>
<li>Prós:
<ul>
<li>Todas as informações de uma instância estão na mesma tabela, o que facilita a manipulação.</li>
<li>Permite referências à classe pai.</li>
</ul>
</li>
<li>Contras:
<ul>
<li>Muitos campos nulos &#8211; pode ser muito deselegante para grandes árvores de classes.</li>
<li>Muitos registros na mesma tabela podem retardar as busca. Mesmo que indexemos o campo <em>tipo</em> teremos problemas, já que só é utilizado um índice por busca.</li>
<li>Registros muito grandes podem retardar as buscas.</li>
<li>Campo <em>tipo</em> extra.</li>
<li>Não permite referência específica às subclasses.</li>
</ul>
</li>
</ul>
<p>Note que essa solução falha se precisarmos ter uma referência para a subclasse. Se as mensagens, por exemplo, pudessem ser trocadas apenas entre clientes, não haveria como fazer essa restrição no banco de dados. E se nossa árvore de classes for grande a tabela se tornará um monstro com dezenas de campos nulos em cada registro. Precisamos ainda de uma solução melhor.</p>
<h3>Uma tabela por classe</h3>
<p>Podemos mapear cada classe para uma tabela, fazendo a representação da hereança por um relacionamento 1 para n:</p>
<p style="text-align:center;"><a href="http://owebmaster.files.wordpress.com/2008/07/relacional-3.png"><img class="size-full wp-image-59 aligncenter" src="http://owebmaster.files.wordpress.com/2008/07/relacional-3.png?w=450&#038;h=203" alt="" width="450" height="203" /></a></p>
<p style="text-align:left;">Assim temos 1 tabela por classe, relacionando as classes de forma a mater a árvore e usando o campo <em>tipo </em>para indicar a subclasse. Na hora de buscar um registro, checa-se esse campo para saber qual é a classe e, logo, qual outra tabela consultar.</p>
<ul>
<li>Prós:
<ul>
<li>Mantém as hierarquia das classes.</li>
<li>Não contém campos nulos.</li>
<li>Não quebra o encapsulamento de implementação da classe pai.</li>
<li>Permite fazer referências tanto a classe pai quanto às subclasses.</li>
<li>Registros pequenos, com poucos campos.</li>
</ul>
</li>
<li>Contras:
<ul>
<li>Os atributos de um objeto estão espalhados em mais de uma tabela, tornando as buscas mais complexas.</li>
<li>As buscas podem ficar mais lentas pelo uso excessivo de <em>joins</em>.</li>
<li>Campo <em>tipo</em> extra.</li>
</ul>
</li>
</ul>
<p>Essa solução é mais completa, podendo ser utilizada em todas as situações. Além disso ela tem uma boa relação custo/benefício até para situações onde as outras soluções também são possíveis.</p>
<h3>Conclusão</h3>
<p>Recomendo utilizar a solução de <em>uma tabela por classe</em> <strong>sempre</strong>. O motivo é simples: mesmo que as outras soluções sejam aplicáveis em algumas situações, essas situações podem mudar na próxima alteração, forçando a implementar <em>uma tabela por classe</em> . Além disso, a perda de desempenho pode ser bastante minimizada pela utilização correta de índices.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/owebmaster.wordpress.com/51/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/owebmaster.wordpress.com/51/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owebmaster.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owebmaster.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owebmaster.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owebmaster.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owebmaster.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owebmaster.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owebmaster.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owebmaster.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owebmaster.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owebmaster.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=51&subd=owebmaster&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://owebmaster.wordpress.com/2008/07/01/mapeamento-objeto-relacional-orm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/84c2890292749e6664dc8c7f2f75a987?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Diego M. Quinteiro</media:title>
		</media:content>

		<media:content url="http://owebmaster.files.wordpress.com/2008/07/modelo.png?w=218" medium="image" />

		<media:content url="http://owebmaster.files.wordpress.com/2008/07/relacional-1.png?w=300" medium="image" />

		<media:content url="http://owebmaster.files.wordpress.com/2008/07/modelo-2.png" medium="image">
			<media:title type="html">UML - Referência à classe pai</media:title>
		</media:content>

		<media:content url="http://owebmaster.files.wordpress.com/2008/07/relacional-2.png" medium="image" />

		<media:content url="http://owebmaster.files.wordpress.com/2008/07/relacional-3.png" medium="image" />
	</item>
		<item>
		<title>Bordas arredondadas no CSS com uma forcinha do PHP</title>
		<link>http://owebmaster.wordpress.com/2008/06/29/bordas-arredondadas-no-css-com-uma-forcinha-do-php/</link>
		<comments>http://owebmaster.wordpress.com/2008/06/29/bordas-arredondadas-no-css-com-uma-forcinha-do-php/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 17:50:45 +0000</pubDate>
		<dc:creator>Diego M. Quinteiro</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://owebmaster.wordpress.com/?p=24</guid>
		<description><![CDATA[Bordas arredondadas parecem nunca sair de moda. Para a infelicidade dos webdesigners, adicionar mais de uma imagem de fundo a um elemento e a propriedade &#8220;border-radius&#8221; são exclusividades da versão 3 do CSS, que ainda não é suportada pelo navegador da Microsoft e por isso seu uso está fora de cogitação.
Mas nem tudo está perdido: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=24&subd=owebmaster&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Bordas arredondadas parecem nunca sair de moda. Para a infelicidade dos webdesigners, adicionar mais de uma imagem de fundo a um elemento e a propriedade &#8220;border-radius&#8221; são <a title="bordas arrendodadas no CSS2" href="http://24ways.org/2006/rounded-corner-boxes-the-css3-way">exclusividades da versão 3 do CSS</a>, que ainda não é suportada pelo navegador da Microsoft e por isso seu uso está fora de cogitação.</p>
<p>Mas nem tudo está perdido: uma ótima técnica que utiliza CSS2, descrita no <a title="criando bordas arrendondadas com CSS2" href="http://www.schillmania.com/projects/dialog2/">artigo &#8220;Even More Rounded Corners&#8221;,</a> permite mostrar bordas arredondadas utilizando apenas uma imagem PNG com a caixa inteira e uma porção de declarações &#8220;background-position&#8221; para fatiar virtualmente a imagem. Como todas as soluções compatíveis com o IE, ela necessita de marcação extra no HTML para funcionar. Na verdade, ela é bem compacta, vejam:</p>
<pre class="brush: xml;">
&lt;div class=&quot;dialog&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;t&quot;&gt;&lt;/div&gt;
&lt;!-- Seu contéudo vai aqui --&gt;&lt;/div&gt;
&lt;div class=&quot;b&quot;&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Mesmo compacta ela ainda causa, em menor intensidade, os mesmos já conhecidos problemas das marcações extras:</p>
<ul>
<li>Dificuldade de manutenção: é necessário reproduzir a estrutura cada vez que quisermos uma caixa arredondada.</li>
<li>Perda de legibilidade: seu conteúdo ficará escondido num mar de DIVs inúteis.</li>
<li>Quebra de encapsulamento: tags com propósito unicamente visual (DIVs vazias!) tornam o código menos semântico e intuitivo.</li>
</ul>
<p>Não sendo possível diminuir mais a quantidade de <span style="text-decoration:line-through;">porcaria</span> marcação inútil servida para o usuário, podemos ao menos reduzir algumas linhas do nosso código fonte no servidor, utilizando o PHP.</p>
<p>A solução aqui apresentada permitirá escrever no fonte:</p>
<pre class="brush: xml;">
&lt;div class=&quot;dialog&quot;&gt;
&lt;!-- Seu conteúdo vai aqui --&gt;&lt;/div&gt;
</pre>
<p>E ter como resultado o código &#8220;sujo&#8221; da técnica do &#8220;Even More Rounded Corners&#8221; na saída. O truque é fazer com que o PHP injete as divs necessárias e sirva para o usuário a marcação extra sem sujar o fonte, melhorando legibilidade, facilitando a manutenção e evitando em certo nível a quebra de encapsulamento. Para executar a mágica vamos usar o <a title="manual sobre o buffer do PHP" href="http://br2.php.net/manual/pt_BR/book.outcontrol.php">controle de buffer de saída do PHP</a> e a extensão <a title="referência do manual do PHP" href="http://br.php.net/manual/pt_BR/book.dom.php">DOM</a>, para manipular o HTML.</p>
<p>Primeiro, vamos precisar adicionar o seguinte código no início da página, fazendo com que ele execute antes do script emitir qualquer saída:</p>
<pre class="brush: php;">
&lt;?
// Captura a saída em um buffer.
ob_start();
?&gt;
</pre>
<p>Isso garantirá que toda a saída do PHP seja guardada em um buffer, ao invés de ser enviada diretamente ao <em>user agent</em>.</p>
<p>O próximo e último passo é pegar toda a saída e injetar a marcação extra. Isso deve ser feito, é claro, no fim do script, depois de qualquer saída ter sido gerada e, conseqüentemente, guardada no buffer:</p>
<pre class="brush: php;">
&lt;?
// Lê o buffer de saída para uma variável string.
$saida = ob_get_contents();

ob_end_clean();

// Defina aqui a classe a ser considerada
// para caixas arredondadas.
$classe = &quot;dialog&quot;;

// Carrega o documento na classe DOM.
$dom = new DomDocument(&quot;1.0&quot;);

// Detecta a codificação da página.
if (
  mb_detect_encoding(
  $saida . 'a' , 'UTF-8, ISO-8859-1' )
  ==
  &quot;UTF-8&quot;
  )
{
  $saida = utf8_decode($saida);
}
$dom-&gt;loadHTML($saida);

// Seleciona todas as DIVs
$divs = $dom-&gt;getElementsByTagName(&quot;div&quot;);

foreach ($divs as $div) {

  // Filtra as DIVs da classe selecionada.
  if (strstr($div-&gt;getAttribute(&quot;class&quot;), $classe)) {

    // Cria os nós adicionais
    $content_div = $dom-&gt;createElement(&quot;div&quot;);
    $content_div-&gt;setAttribute(&quot;class&quot;, &quot;content&quot;);

    $t_div = $dom-&gt;createElement(&quot;div&quot;);
    $t_div-&gt;setAttribute(&quot;class&quot;, &quot;t&quot;);

    $b_div = $dom-&gt;createElement(&quot;div&quot;);
    $b_div-&gt;setAttribute(&quot;class&quot;, &quot;b&quot;);

    $extra_div = $dom-&gt;createElement(&quot;div&quot;);

    // Cria a árvore correta
    $b_div-&gt;appendChild($extra_div);
    $content_div-&gt;appendChild($t_div);

    // Importa o conteúdo do div a ser arredondado
    // para dentro de 'content'.
    while ($div-&gt;hasChildNodes()) {
      $content_div-&gt;appendChild(
      $div-&gt;removeChild($div-&gt;firstChild)
      );
    }

    // Adiciona tudo de volta à div.
    $div-&gt;appendChild($content_div);
    $div-&gt;appendChild($b_div);
  }
}

$resultado = $dom-&gt;saveHTML();

echo $resultado;

?&gt;
</pre>
<p>É claro que você não irá copiar e colar esse texto em todas as suas páginas. Você pode usar dois includes (um no começo do documento e outro ao final), e ainda, se você usa algum sistema de templates, fazer esses includes apenas no arquivo do template.</p>
<p>Podemos adaptar essa técnica para várias outras situações onde necessitamos de marcação extra. Podemos ainda adaptá-la facilmente para rodar no lado do cliente, uma vez que as funções DOM do PHP e do javascript são praticamente idênticas. O único porém deste último método é que não podemos garantir que o <em>user agent</em> suporte e esteja com o javascript habilitado e é então sujeitos a falhas, motivo pelo qual escolhi o método server-side.</p>
<p>Agora ninguém mais tem desculpa para fazer cara feia quando tiver que implementar aquele design todo arredondado!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/owebmaster.wordpress.com/24/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/owebmaster.wordpress.com/24/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owebmaster.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owebmaster.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owebmaster.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owebmaster.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owebmaster.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owebmaster.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owebmaster.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owebmaster.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owebmaster.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owebmaster.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=24&subd=owebmaster&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://owebmaster.wordpress.com/2008/06/29/bordas-arredondadas-no-css-com-uma-forcinha-do-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/84c2890292749e6664dc8c7f2f75a987?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Diego M. Quinteiro</media:title>
		</media:content>
	</item>
		<item>
		<title>CSS Hacks ou comentários condicionais?</title>
		<link>http://owebmaster.wordpress.com/2008/06/29/css-hacks-ou-comentarios-condicionais/</link>
		<comments>http://owebmaster.wordpress.com/2008/06/29/css-hacks-ou-comentarios-condicionais/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 11:47:38 +0000</pubDate>
		<dc:creator>Diego M. Quinteiro</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[ie]]></category>

		<guid isPermaLink="false">http://owebmaster.wordpress.com/?p=3</guid>
		<description><![CDATA[Meu xará Diego Eis escreveu um interessante artigo já há alguns meses em seu famoso blog do site Tableless, o qual recomendava o não uso de comentários condicionais e defendia o uso de CSS Hacks.
O argumento central do texto é que o uso de comentários condicionais duplicam o trabalho do desenvolvedor, pois é criado um [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=3&subd=owebmaster&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Meu xará Diego Eis escreveu <a title="artigo do tableless.com.br" href="http://www.tableless.com.br/comentarios-condicionais-nao-use">um interessante artigo</a> já há alguns meses em seu famoso blog do site <a title="Tableless" href="http://tableless.com.br">Tableless</a>, o qual recomendava o não uso de <a title="entenda o que são comentários condicionais" href="http://www.maujor.com/tutorial/condcom.php">comentários condicionais</a> e defendia o uso de <a title="sobre css hacks" href="http://www.joomla.com.br/tutoriais-mainmenu-47/70-tutoriais/34-css-hackas.html">CSS Hacks</a>.</p>
<p>O argumento central do texto é que o uso de comentários condicionais duplicam o trabalho do desenvolvedor, pois é criado um arquivo CSS para os navegadores mais compatíveis com as <a title="especificação da W3C para o CSS" href="http://www.w3.org/Style/CSS/">especificações da <acronym title="World Wide Web Consortium">W3C</acronym></a> e outro(s) para os navegadores Internet Explorer. Dada a opção de usar dois arquivos, a tendência é criar uma folha de estilos muito diferente ou até mesmo independente para o navegador da Microsoft.</p>
<p>Mas ao dar uma passada de olho nas <a title="estat�&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;sticas do The Counter" href="http://www.thecounter.com/stats/2008/June/browser.php">estatísticas de uso de navegadores deste mês</a> notamos que cerca de 98% dos usuário utilizam Internet Explorer 6, Internet Explorer 7, Firefox, Opera ou Safari. Menos de 1% utilizam o Internet Explorer 5, conhecido pelo sua <a title="artigo da wikipedia em inglês, a imagem do artigo diz tudo!" href="http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug">implementação problemática do CSS Box Model</a>. Isto significa que se <a title="sobre o doctype switch" href="http://www.tableless.com.br/doctype">usarmos o <em>Doctype Switch</em> para deixar o IE6 em <em>Strict Mode</em></a>, atenderemos mais de 98% dos visitantes sem nos valermos do famigerado <em><a title="hack para contornar o bug do IE5" href="http://www.maujor.com/tutorial/boxmodelhack.php">Box Model Hack</a></em>! Sendo assim, não precisamos mais definir a altura/largura de cada elemento duas vezes, enxugando de forma decisiva o arquivo CSS exclusivo para os IEs.</p>
<p>Podemos em alguns casos eliminar completamente esse arquivo e ao mesmo tempo não usar nenhum hack, nivelando por baixo os recursos usados e tolerando algumas pequenas diferenças de renderização. Esse é melhor dos mundos, mas em layouts mais rígidos ou complexos e no uso de algumas técnicas mais sofisticadas isso infelizmente não é uma opção, e voltamos a ter que decidir entre hacks e comentários condicionais. Levando em conta o que já foi dito, faço uma avaliação dos prós e contras de cada solução:</p>
<p><strong>Comentarios condicionais:</strong></p>
<ul>
<li>Prós:
<ul>
<li>Mantém o CSS original inalterado e <a title="validação CSS pela W3C" href="http://jigsaw.w3.org/css-validator/">válido</a>.</li>
<li>Permite servir CSS customizado ou proprietário de forma segura e suportada pela Microsoft.</li>
<li>Pode-se criar um arquivo diferente para cada versão do IE.</li>
<li>Feitos para serem usados!</li>
</ul>
</li>
<li>Contras:
<ul>
<li>Arquivo separado pode ser difícil de manter.
<ul>
<li>Não é trivial notar onde existe ou não uma correção para o IE ao ler o arquivo original.</li>
<li>Por vezes também não é imediata a compreensão do funcionamento da correção no arquivo customizado sem ler a definição no arquivo original.</li>
</ul>
</li>
<li><a href="http://developer.yahoo.com/performance/rules.html">Uma requisição HTTP a mais</a>.</li>
<li>Adições no HTML que apesar de comentadas são grandes.</li>
<li>Horrível de implementar em definições do atributo <em>style</em> da <em>tag</em>.</li>
</ul>
</li>
</ul>
<p><strong>CSS Hacks:</strong></p>
<ul>
<li>Prós:
<ul>
<li>Tudo no mesmo arquivo, é fácil ver onde as correções acontecem e ao que se aplicam.</li>
<li>Mais compacto, pode ser aplicado facilmente no atributo <em>style</em>.</li>
<li>Pode ser usado em definições do atributo style do javascript.</li>
<li>Em alguns casos são necessários para outros navegadores que não o Internet Explorer.</li>
</ul>
</li>
<li>Contras:
<ul>
<li>Alterações no CSS original, possivelmente comprometendo a validação.</li>
<li>Método não suportado, pode criar problemas a cada atualização que a Microsoft liberar.</li>
<li>Hacks diferenciais (que afetam apenas uma versão) são deselegantes e deus sabe quanto deselegantes eles podem se tornar nas próximas versões do IE, ou mesmo se alguém será capaz de desenvolvê-los.</li>
<li>Baseados em bugs!</li>
</ul>
</li>
</ul>
<p>Atentando para cada um destes detalhes, faço minhas recomendações. Seguem passo a passo:</p>
<ol>
<li>Use o <em>Doctype Switch</em> para ativar o <em>Strict Mode</em> no IE6.</li>
<li>Ignore o IE5 e anteriores.</li>
<li>Procure diminuir ao máximo as diferenças entre as definições CSS dos navegadores. Tente eliminá-las completamente, utilizando um <a title="técnica que remove a formatação padrão do navegador" href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">CSS Reset</a> e simplificando o layout de forma que as pequenas diferenças de renderização não atrapalhem muito. Isso é fácil de fazer para o IE7, mas pode ser bastante difícil para o IE6, então não complique muito seu código para atingir esse objetivo e considere o próximo passo.</li>
<li>Caso sobrem diferenças, separe-as em outro arquivo (use um nome sugestivo, &#8216;iefix.css&#8217;) <strong>utilizando os comentários condicionais</strong>. Não crie mais de um arquivo, trabalhe bastante no passo anterior para não precisar de um específico para o IE7.</li>
<li>Utilize comentários no CSS original para indicar onde existem correções no arquivo &#8216;iefix.css&#8217;.</li>
<li><a title="bom artigo sobre os motivos de não utilizar o atributo style." href="http://revolucao.etc.br/archives/esqueca-o-atributo-style-estilos-inline-em-doctype-strict-sao-resquicios-do-cancer-de-um-passado-sem-padroes/">Não utilize o atributo <em>style</em></a>. Se precisar alterar o estilo por javascript, utilize classes.</li>
<li>Se notar que seu &#8216;iefix.css&#8217; estiver crescendo muito, considere voltar ao passo 3. Se não houver mais onde enxugar e o tamanho do arquivo ainda for um problema, considere utilizar os Hacks, mas não utilize uma técnica híbrida: utilize <em>CSS Hacks</em> <strong>ou</strong> comentários condicionais &#8211; misturar os dois é a receita certa para dores de cabeça.</li>
</ol>
<p>Espero ter ajudado (a colocar mais lenha na fogueira desta disussão)!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/owebmaster.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/owebmaster.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owebmaster.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owebmaster.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owebmaster.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owebmaster.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owebmaster.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owebmaster.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owebmaster.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owebmaster.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owebmaster.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owebmaster.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=owebmaster.wordpress.com&blog=4097925&post=3&subd=owebmaster&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://owebmaster.wordpress.com/2008/06/29/css-hacks-ou-comentarios-condicionais/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/84c2890292749e6664dc8c7f2f75a987?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Diego M. Quinteiro</media:title>
		</media:content>
	</item>
	</channel>
</rss>