• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Passar argumentos por referência em funções

19 mensagens neste tópico

Estava aqui ver um código que tinha feito há uns tempos onde tenho várias funções que me dão jeito devolver 2 valores e como cada função só pode devolver um, optei por passar 2 variáveis por referência e resolvia o problema.

A minha questão é, isto em PHP, é boa ou má prática?

E se puderem, justifiquem o vosso ponto de vista e não digam apenas "é boa" ou "é má".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

O que é "passar argumentos por referência"?

Abraço,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é do estilo

function abc( & $var, & $var2 ){}

Quanto à boa ou má prática... eu acho que por defeito as variáveis deviam sempre ser passadas por referencia (o que acho que já acontece com php5). O que tu fazes nas tuas funções, é precisamente o que as referências foram feitas para fazer, logo não penso que seja má prática.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu por vicio, em qualquer metodo que tenha de passar mais que um valor é "return $oReturn = array()"; não falha, esta sim, talvez não seja correcta, porque estou a comer mem.

Não vejo nenhum inconveniente nisso, e até acho que seja bem pensado :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu por vicio, em qualquer metodo que tenha de passar mais que um valor é "return $oReturn = array()"; não falha, esta sim, talvez não seja correcta, porque estou a comer mem.

Não vejo nenhum inconveniente nisso, e até acho que seja bem pensado :)

Pois, mas isso continua a ser uma incoveniência, porque como disses-te só come mais ram. Além disso por referência, não estás a criar novas variáveis, mas sim a "apontar" para elas, o que poupa ainda mais.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também tinha pensado nisso de devolver um array mas como disseram, come mais memoria...

Só estava a perguntar porque poderia haver algum tipo de problema, uma pessoa nunca sabe tudo e eu por habito evito passar valores por referência. Se a estrutura das funções não for bem pensada, ao passar variáveis por referência pode dar barraca.

Por essa mesma razão, acho que o o PHP5 não faz isso por omissão (ya, não sei diz "por defeito" :)), não tenho a certeza, mas acho que não... Pelo menos já uso o PHP5 desde que ele saiu e nunca reparei que isso estivesse a acontecer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pode dar barraca? Tens é que ter em mente, que quando passas as variáveis por referência, estás a mexer directamente nelas e não numa "cópia" da variável.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, ma se te esqueceres que passaste os valores por referência, pode dar barraca... Digo isto porque o que e mais comum se fazer é passar os valores e não as referências, logo, se estas a passar por referência, coisa que não é normal ser feito, podes-te esquecer desse pormenor. Só isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não te podes esquecer :thumbsup:

Queres retornar dois valores? é moda antiga ou a moda dos objectos? (sim porque isto é por modas XD)

sinceramente.... fazia como o kimico a exepção do seguinte: return $coiso=array('da coisa') trocaria por defenir antes e enviar somente a array, nao gosto cá de andar a defenir "no final"

Orientado a objectos... pah... é mandar para a frente o objecto alguem ha de o apanhar...

Agora outra coisa... RAM? mas aqui alguem trabalha no google ou no sapo por acaso? é martelara para a frente não vai ser por uma marteladazita que o servidor vai morrer XD alem disso, a ram é  muita, ninguem a usa lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu devolvo sempre um array ou um objecto quando preciso de devolver uma estrutura de dados.

É naquela do keep it simple. Acho que é muito menos susceptivel a bugs. O PHP lá tratará de usar isso convenientemente, anyway, o que é meia dúzia de bytes usados durante milisegundos em gigas de RAM que os os pcs têm hoje em dia.

Este tipo de coisas acaba por não ter grande influencia na velocidade de um programa porque é insignificante.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta funcionalidade existe mesmo para estas situações. Não me parece que seja má prática.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebo bem essa dos objectos... Estão a falar em devolver um objecto na função? Tendo em conta o meu exemplo isso não tem grande lógica, eu só estava a falar de duas variáveis, nada mais...

Mas tanto uma opção como a outra são bem simples, qual é que vocês preferem e porquê? Ou seja, porquê que usam um método (qual) e não o outro? O que vos faz usar um e não o outro? Acho que já perceberam...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podem dizer que é simples, mas não é, e vou explicar porquê.

Se eu usar essa tecnica num script, quem o for ler e estiver a seguir o valor de uma variável tem que tomar atenção ao conteudo das funções onde ela é passada or referencia, indeendentemente do que a função devolva.

enquanto se a variável for passada por cópia basta saber o que a função devolve e todo o código pode ser lido com toda a certeza.

Por outras palavras, na maior parte dos casos acaba por ser uma forma escrever código esparguete.

Isto é mais utilizado em C quando se pretende alterar mais do que uma varável sem ter que estar a recorrer a estruturas de dados desnecessárias. Essa é que é a razão, não é uma questão de poupança de memória... às vezes até é, mas isso é raro e no caso de linguagens cujo tipo de dados das variáveis é dinamico o argumento da memória até é inválido em muitos casos.

O problema que pode acontecer é este:

passa-se uma variável por referencia que tem lá um inteiro, tudo bem. Fazem-se as continhas e poe-se para lá o resultado cujo valor é por exemplo um 'inteiro grande', isto tudo acontece sem que o programador tenha a mais pequena ideia. Está o caldo entornado, para dizer a verdade nem sei se recebem um erro, se vão destruir outras variáveis ou se acabam por consumir mais memoria e ciclos a rearranjar o alocamento de variáveis.

Por exemplo, em C++ ou java, ou basicamente em qualquer linguagem que seja mais utilizada devido ao seu suporte para POO, o aconselhado é criar métodos set() e get() para alterar variáveis.

Agora tudo depende como é óbvio, se se tratar de um programa de cálculo massivo claro que andar a copiar valores para tras e para a frente não é desejável, mas isso teria muito mais que se lhe diga.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ambos são simples e agora? ;)

Depende dos casos.

Como estámos a falar de PHP, presumo que a eficiência não seja um factor importante. Portanto diria que a segunda forma é a melhor. Ganhavas transparência referencial, o que na maior parte dos casos torna o teu código mais legível e mais fácil de analisar. Mas também estamos a falar de PHP, presumo que a qualidade do código não seja um factor importante também :)

Por exemplo, em C++ ou java, ou basicamente em qualquer linguagem que seja mais utilizada devido ao seu suporte para POO, o aconselhado é criar métodos set() e get() para alterar variáveis.

Sim, mas isso não tem nada haver. Isso é mais por uma questão de modularidade, aliás na maior parte dos casos os get e sets vão usar referências.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Betovsky, já vi que estamos de acordo ;) só esta última parte é que discordo.

Ou fizeste confusão com alguma coisa ou sou eu que não estou a perceber ao que te estás a referir em concreto, métodos tipo get() ou set() tipicamente  nem precisam que o valor a mudar seja passado como parâmetro porque podem usar o ponteiro para o próprio obejecto (this, self, etc).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora