[{"@context":"https:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/ivonascimento.com\/2008\/12\/09\/artigo-sobre-sobrecarga-de-operadores-em-php\/#BlogPosting","mainEntityOfPage":"https:\/\/ivonascimento.com\/2008\/12\/09\/artigo-sobre-sobrecarga-de-operadores-em-php\/","headline":"Artigo sobre Sobrecarga de Operadores em php","name":"Artigo sobre Sobrecarga de Operadores em php","description":"Talvez n\u00e3o seja um assunto ao qual a maioria dos programadores php esteja acostumado, mas com certeza \u00e9 uma feature...","datePublished":"2008-12-09","dateModified":"2008-12-09","author":{"@type":"Person","@id":"https:\/\/ivonascimento.com\/author\/ivonascimento\/#Person","name":"Ivo Nascimento","url":"https:\/\/ivonascimento.com\/author\/ivonascimento\/","identifier":10240028,"image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/2305ea1f48319271d323c5e1c0aadd4cc45d10c4927dd8b3af083facb8c6f75f?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2305ea1f48319271d323c5e1c0aadd4cc45d10c4927dd8b3af083facb8c6f75f?s=96&d=identicon&r=g","height":96,"width":96}},"publisher":{"@type":"Person","name":"Ivo Nascimento"},"image":{"@type":"ImageObject","@id":"https:\/\/ivonascimento.com\/wp-content\/uploads\/2025\/11\/1678128251648-e1763258046842.jpeg","url":"https:\/\/ivonascimento.com\/wp-content\/uploads\/2025\/11\/1678128251648-e1763258046842.jpeg","width":100,"height":100},"url":"https:\/\/ivonascimento.com\/2008\/12\/09\/artigo-sobre-sobrecarga-de-operadores-em-php\/","about":["php"],"wordCount":1741,"articleBody":"Talvez n\u00e3o seja um assunto ao qual a maioria dos programadores php esteja acostumado, mas com certeza \u00e9 uma feature que aqueles que programam em outras linguagens al\u00e9m de php gostariam de ver adicionada a este.A sobrecarga de operadores consiste em permitir que sejam especificados algor\u00edtmos para ao menos os operadores aritm\u00e9ticos, mas que em sua totalidade, deveria cobrir todos os operadores.Se n\u00e3o ficou claro, e talvez n\u00e3o tenha ficado, imagine o seguinte:Com rela\u00e7\u00f5es aos n\u00fameros, com certeza voc\u00ea j\u00e1 efetuou somas, subtra\u00e7\u00f5es, multiplica\u00e7\u00f5es e divis\u00f5es e&#8230;, e achou isso \u00fatil, com certeza, mas ser\u00e1 que em algum momento voc\u00ea desejou somar grandezas n\u00e3o escalares?!Somar, por exemplo todos os Value Objects(VO) de produto para requerer o valor total de uma compra aplicar o Objeto ISS sobre uma nota fiscal para obter o valor a ser pago com a opera\u00e7\u00e3o.Essas opera\u00e7\u00f5es que descrevi envolvem objetos e, para serem realizadas, necessitam ter c\u00f3digo consciente das propriedades e m\u00e9todos que s\u00e3o respons\u00e1veis por guardar e dispor essas informa\u00e7\u00f5es, de forma que seria necess\u00e1rio:\t\/\/ c\u00f3digo 0.\t$ISS = new ISS(\"SP\");\t$Mercadoria = new Mercadororia(Array(\"cod\"=&gt; 104515));\t$ValorImpostoISS = $ISS-&gt;getValue()*$Mercadoria-&gt;getValue();Quando na realidade seu desejo, seria poder fazer essa opera\u00e7\u00e3o assim:\t\/\/ c\u00f3digo 1.\t$ISS = new ISS(\"SP\");\t$Mercadoria = new Mercadororia(Array(\"cod\"=&gt; 104515));\t$ValorImpostoISS = $ISS*$Mercadoria;Concorda?Se voc\u00ea concorda, pode continuar seguinte a leitura desse artigo, por que acho que ele vai te ajudar a poder fazer isso, sen\u00e3o, acho melhor voc\u00ea continuar tamb\u00e9m por que depois de saber como funciona provavelmente voc\u00ea far\u00e1 parte do time de interessados, logo, temos que:Time1 \u222a Time2 \u2208 Time Interessados \ud83d\ude09Voltando da viagem(sic), vou come\u00e7ar a falar de sobrecarga por um tipo n\u00e3o escalar do php que permite a sobrecarga e que talvez voc\u00ea ainda n\u00e3o tenha percebido.O array, que representar um conjunto de valores, unidimensional(vetor) ou com duas ou mais dimens\u00f5es(array), e essa discrep\u00e2ncia de terminologia no php j\u00e1 me deixa chateado, afinal, vetor \u00e9 vetor e array \u00e9 array, suporta a opera\u00e7\u00e3o de adi\u00e7\u00e3o, mas n\u00e3o soma os itens. O que ocorre \u00e9 uma uni\u00e3o entre os array que participam da soma, mas j\u00e1 \u00e9 um operador escalar trabalhando num valor n\u00e3o escalar, concorda, logo:\/\/c\u00f3digo 2$a = Array(\"a1\"=&gt;1,\"a2\"=&gt;2,\"a3\"=&gt;3);$b = Array(\"b1\"=&gt;1);var_dump($a+$b);\/*array  'a1' =&gt; int 1  'a2' =&gt; int 2  'a3' =&gt; int 3  'b1' =&gt; int 1*\/Acima, a opera\u00e7\u00e3o de soma com o array, foi apresentada para ilustrar que um operador no qual voc\u00ea esta acostumado a confiar para executar uma a\u00e7\u00e3o, pode, dependendo do contexto, realizar uma opera\u00e7\u00e3o diferente, como nesse caso, ao inv\u00e9s de somar os itens(a\u00e7\u00e3o esperada), executou um union.No outro exemplo abaixo, veja o comportamento que resultou.class produto{\/\/ objeto que representa produtos de uma loja... private $preco=0; private $label=0; function __construct($p,$l){  $this-&gt;preco = $p;  $this-&gt;label = $l; }}$a1 = new produto(10,\"Produto 1\");$a2 = new produto(15, \"Produto 2\");var_dump($a1);var_dump($a2);var_dump($a1+$a2);\/*object(produto)[1]  private 'preco' =&gt; int 10  private 'label' =&gt; string 'Produto 1' (length=9)object(produto)[2]  private 'preco' =&gt; int 15  private 'label' =&gt; string 'Produto 2' (length=9)int 2*\/Isso n\u00e3o \u00e9 nenhum sonho de funcionalidade, afinal, o resultado indicar que o operador de adi\u00e7\u00e3o realizou um count no n\u00famero de itens, ao inv\u00e9s de me dar o pre\u00e7o dos produtos somados, afinal, se eu somar os produtos, eu vou querer somar os pre\u00e7os e n\u00e3o os nomes\/labels dos mesmo, correto?Pois bem, mas essa \u00e9 uma das poucas vezes em que um operador no php tem um comportamento &#8220;n\u00e3o esperado&#8221;.Essa introdu\u00e7\u00e3o tinha por intuito mostrar que um operador sobrecarregado pode fazer algo totalmente diferente do que ele normalmente faria, como usar o operador de deslocamento de bit \u00e0 direita para apagar um caractere numa string e isso poderia ser implementado, mas n\u00e3o faz muito sentido. Sentido faz quando ele permite que a opera\u00e7\u00e3o seja executada como deve, mas dentro de um contexto diferente.No php, n\u00e3o \u00e9 permitido sobrecarregar operador e isso \u00e9 sabido de todos, mas Sara Goleman criou uma extens\u00e3o chamada operator(sugestivo n\u00e3o) que esta dispon\u00edvel no pecl que permite fazer exatamente isso, e assim adiciona uma funcionalidade muito boa \u00e0 esta linguagem que todos adoramos.A operator esta na vers\u00e3o 0.0.3 e n\u00e3o recebe updates desde 2008, mas fiz testes com ela(que ser\u00e3o apresentados a seguir) que me deixaram feliz e confiante de que ela poderia ser utilizada em produ\u00e7\u00e3o.A operator consiste numa s\u00e9rie de fun\u00e7\u00f5es m\u00e1gicas\/especiais(lembra, aquelas que tem dois under score no inicio do nome) para as quais o programador pode escrever o algor\u00edtmo que bem entender e os operadores que a extens\u00e3o consegue sobrecarregar, segundo a p\u00e1gina do pacote s\u00e3o os +, -, *, \/, %, &lt;&lt;, &gt;&gt;, ., |, &amp;, ^, ~, !, ++, &#8211;, +=, -=, *=, \/=, %=, &lt;&lt;=, &gt;&gt;=, .=, |=, &amp;=, ^=, ~=, ==, !=, ===, !==, &lt;, and &lt;= e tamb\u00e9m para os operadores l\u00f3gicos &gt; e &gt;= se for aplicado um patch [procurar este patch].A extens\u00e3o em si tem 164 k quando compilada e consistem em um shared object, ou seja, nada de segredos e vamos ent\u00e3o \u00e0 instala\u00e7\u00e3o.Na minha m\u00e1quina eu estou trabalhando com o snapshot da 5.3.0.Usando pecl a coisa fica simples.\t\tpecl install operator, mas se voc\u00ea \u00e9 daqueles que gosta de fazer as coisas na m\u00e3o, a instala\u00e7\u00e3o seria dividida em mais passos.1o &#8211; Fazer download do tar.gz da vers\u00e3o 0.3 da extens\u00e3o em http:\/\/pecl.php.net\/package\/operator ou  usar wget http:\/\/pecl.php.net\/get\/operator-0.3.tgz.2o &#8211; Escolher um lugar para colocar o pacote(eu ainda uso o \/opt) e descompactar com tar -xvf operator-0.3.tgz.3o &#8211; Entre no diret\u00f3rio operator-0.3.4o &#8211; digite os comandos phpize &amp; make &amp; make installSe tudo correr bem(e imagino que v\u00e1 correr, pois testei e n\u00e3o deu bug) voc\u00ea j\u00e1 ter\u00e1 instalado a extens\u00e3o e para ter certeza, que tal digitar\t\tphp -i | grep operatorSe aparacer o descritivo da extens\u00e3o, ok, ela foi instalada com sucesso.No objeto que for ser criado n\u00e3o h\u00e1 necessidade de extender ou implementar nada. O importante s\u00e3o as fun\u00e7\u00f5es m\u00e1gicas especiais para sobrecarga, que come\u00e7aremos a ver agora.        function __add($val) ;\/\/ sobrecarrega do operador +        function __sub($val) ;\/\/ sobrecarrega do operador -        function __mul($val) ;\/\/ sobrecarrega do operador *        function __div($val) ;\/\/ sobrecarrega do operador \/        function __mod($val) ;\/\/ sobrecarrega do operador %        function __sl($val) ;\/\/ sobrecarrega do operador &lt;&lt; (deslocamento de bit a esquerda)         function __sr($val) ;\/\/ sobrecarrega do operador &gt;&gt; (deslocamento de bit a direita)        function __concat($val);\/\/ sobrecarrega do operador .        function __bw_or($val) ;\/\/ sobrecarrega do operador | (ou)\tfunction __bw_and($val) ;\/\/ sobrecarrega do operador &amp; (and)        function __bw_xor($val) ;\/\/ sobrecarrega do operador ^ (xor - ou exclusivo)O primeiro exemplo \u00e9 o de um Value Object representando um Item de Compra. Ele tem quatro propriedades que sao Nome do item, valor do produto, taxa de juros e taxa de desconto.        class ItemCompra{\t\tprivate $Nome=\"\";                private $txJuros=0;                private $txDescto=0;                private $valor=0;         function __construct ($nome,$txJ, $txD, $v){\t\t$this-&gt;nome = $nome;                $this-&gt;valor = $v;                $this-&gt;txJuros = $txJ;                $this-&gt;txDescto = $txD;         }         function __add($val) {                return $this-&gt;valor+$val;         }        }\t\/\/ codigo de exemplo\t $item1 = new ItemCompra(\"Item numero 1\", 0.5, 0.3, 99.99);\t echo $item1+10;\/\/imprime 109.99Vamos adicionar as outras opera\u00e7\u00f5es b\u00e1sicas:        class ItemCompra{\t\tprivate $Nome=\"\";                private $txJuros=0;                private $txDescto=0;                private $valor=0;         function __construct ($nome,$txJ, $txD, $v){\t\t$this-&gt;nome = $nome;                $this-&gt;valor = $v;                $this-&gt;txJuros = $txJ;                $this-&gt;txDescto = $txD;         }         function __add($val) {                return $this-&gt;valor+$val;         }        function __sub($val) { return $this-&gt;valor - $val;}        function __mul($val) { return $this-&gt;valor * $val;}        function __div($val) { return $this-&gt;valor \/ $val;}        }\t\/\/ codigo de exemplo\t $item1 = new ItemCompra(\"Item numero 1\", 0.5, 0.3, 99.99);\t echo $item1+10;\/\/imprime 109.99\t echo $item1*2; \/\/ imprime 199,98\t echo $item1-0.99; \/\/ imprime 99;\t echo $item1 \/ 2; \/\/imprime 49,995;E assim por diante, seguindo cada uma das opera\u00e7\u00f5es abaixo(deslocadores de bit e decis\u00e3o bin\u00e1ria&#8230;        function __sl($val) ;\/\/ sobrecarrega do operador &lt;&lt; (deslocamento de bit a esquerda)         function __sr($val) ;\/\/ sobrecarrega do operador &gt;&gt; (deslocamento de bit a direita)        function __concat($val);\/\/ sobrecarrega do operador .        function __bw_or($val) ;\/\/ sobrecarrega do operador | (ou)\tfunction __bw_and($val) ;\/\/ sobrecarrega do operador &amp; (and)        function __bw_xor($val) ;\/\/ sobrecarrega do operador ^ (xor - ou exclusivo)Tudo bonito at\u00e9 agora, mas vamos aos problemas.O que ocorre \u00e9 que a extens\u00e3o operator tem muitos problemas ainda e apesar de ter usado a maioria das formas de contato com a Sara Golemon, ainda n\u00e3o consegui uma resposta por parte dela com rela\u00e7\u00e3o se ela vai continuar a desenvolver esta extens\u00e3o, que esta parada na 0.3(como j\u00e1 comentei anteriormente).Mas tudo isso aqui vale como prova de conceito e mostra que no momento em que pudermos trabalhar sobre os objetos com calculos, sobrecarregando essas opera\u00e7\u00f5es para que fa\u00e7am aquilo que desejarmos o php ter\u00e1 mais um ponto a seu favor.A Zend esta correndo atr\u00e1s dessas funcionalidades com spl_Int, spl_float e outros, mas por enquanto, ainda n\u00e3o saiu do forno e com certeza, quando sair, vou fazer um post sobre o assunto por aqui.Para quem ficou com vontade de testar o operator, instala por ai sem risco, portanto que voc\u00ea n\u00e3o use para produzir, e, se mesmo assim voc\u00ea desejar usar em produ\u00e7\u00e3o(o que n\u00e3o recomendo) ai vai dois problemas que v\u00e3o dificultar seu trabalho:A sobrecarga somente funciona se o objeto estiver \u00e0 esquerda do operador.O m\u00e9todo de concat n\u00e3o funciona pois o php n\u00e3o o v\u00ea e acaba lan\u00e7ando a exce\u00e7\u00e3o de que uma instancia n\u00e3o pode ser convertida para string.Teste somente de php 5.2.6 para baixo, no 5.3 alpha algumas macros em C foram retiradas e j\u00e1 vai dar problemas na compila\u00e7\u00e3o.Enfim, eu gostaria muito de ver esta extens\u00e3o sendo continuada, mas acho que n\u00e3o vai acontencer.Grande Abra\u00e7o.Share this:\t\t\t\tPrint (Opens in new window)\t\t\t\tPrint\t\t\tTweet\t\t\t\tShare on WhatsApp (Opens in new window)\t\t\t\tWhatsApp\t\t\t"},{"@context":"https:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"2008","item":"https:\/\/ivonascimento.com\/2008\/#breadcrumbitem"},{"@type":"ListItem","position":2,"name":"12","item":"https:\/\/ivonascimento.com\/2008\/\/12\/#breadcrumbitem"},{"@type":"ListItem","position":3,"name":"09","item":"https:\/\/ivonascimento.com\/2008\/\/12\/\/09\/#breadcrumbitem"},{"@type":"ListItem","position":4,"name":"Artigo sobre Sobrecarga de Operadores em php","item":"https:\/\/ivonascimento.com\/2008\/12\/09\/artigo-sobre-sobrecarga-de-operadores-em-php\/#breadcrumbitem"}]}]