Guest id194 Posted April 28, 2008 at 11:53 AM Report Share #181867 Posted April 28, 2008 at 11:53 AM 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á". Link to comment Share on other sites More sharing options...
zero-cool Posted April 28, 2008 at 12:34 PM Report Share #181875 Posted April 28, 2008 at 12:34 PM Boas, O que é "passar argumentos por referência"? Abraço, Link to comment Share on other sites More sharing options...
Battousai Posted April 28, 2008 at 12:40 PM Report Share #181876 Posted April 28, 2008 at 12:40 PM é 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. Link to comment Share on other sites More sharing options...
Kimico Posted April 28, 2008 at 12:46 PM Report Share #181878 Posted April 28, 2008 at 12:46 PM 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 🙂 Link to comment Share on other sites More sharing options...
Battousai Posted April 28, 2008 at 01:02 PM Report Share #181887 Posted April 28, 2008 at 01:02 PM 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. Link to comment Share on other sites More sharing options...
Guest id194 Posted April 28, 2008 at 01:58 PM Report Share #181903 Posted April 28, 2008 at 01:58 PM 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. Link to comment Share on other sites More sharing options...
Battousai Posted April 28, 2008 at 02:16 PM Report Share #181916 Posted April 28, 2008 at 02:16 PM 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. Link to comment Share on other sites More sharing options...
Guest id194 Posted April 28, 2008 at 02:38 PM Report Share #181923 Posted April 28, 2008 at 02:38 PM 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. Link to comment Share on other sites More sharing options...
cyclop Posted April 29, 2008 at 08:30 PM Report Share #182421 Posted April 29, 2008 at 08:30 PM Não te podes esquecer 👍 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 "Quando eu for grande quero ser como o Celso" Link to comment Share on other sites More sharing options...
pedrotuga Posted April 29, 2008 at 08:36 PM Report Share #182423 Posted April 29, 2008 at 08:36 PM 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. Link to comment Share on other sites More sharing options...
Battousai Posted April 29, 2008 at 08:55 PM Report Share #182425 Posted April 29, 2008 at 08:55 PM Hum, usar referencia não é "simple"? Ui! Link to comment Share on other sites More sharing options...
Triton Posted April 29, 2008 at 08:56 PM Report Share #182426 Posted April 29, 2008 at 08:56 PM Esta funcionalidade existe mesmo para estas situações. Não me parece que seja má prática. <3 life Link to comment Share on other sites More sharing options...
Guest id194 Posted April 30, 2008 at 12:37 AM Report Share #182525 Posted April 30, 2008 at 12:37 AM 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... Link to comment Share on other sites More sharing options...
cyclop Posted April 30, 2008 at 12:42 AM Report Share #182527 Posted April 30, 2008 at 12:42 AM KISS 4 ever 👍 "Quando eu for grande quero ser como o Celso" Link to comment Share on other sites More sharing options...
Guest id194 Posted April 30, 2008 at 12:53 AM Report Share #182531 Posted April 30, 2008 at 12:53 AM Ambos são simples e agora? 👍 Link to comment Share on other sites More sharing options...
cyclop Posted April 30, 2008 at 01:39 AM Report Share #182537 Posted April 30, 2008 at 01:39 AM Uma moeda ao ar e ver qual XD "Quando eu for grande quero ser como o Celso" Link to comment Share on other sites More sharing options...
pedrotuga Posted May 15, 2008 at 10:47 AM Report Share #185258 Posted May 15, 2008 at 10:47 AM 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. Link to comment Share on other sites More sharing options...
Betovsky Posted May 15, 2008 at 11:21 AM Report Share #185260 Posted May 15, 2008 at 11:21 AM 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. "Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !" Sign on a computer system consultant's desk Link to comment Share on other sites More sharing options...
pedrotuga Posted May 15, 2008 at 11:54 AM Report Share #185270 Posted May 15, 2008 at 11:54 AM 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). Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now