Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rafael_tst

Para que serve esse "&" em métodos e funções

Recommended Posts

Olá galera,

 

Eu peguei aqui no fórum uma classe no Fabyo, to tudo beleza porém vi uma coisa e tenho curiosidade de saber pra que serve, to saindo do procedural e migrando para o OOP, to apanhando mais parece ser melhor mesmo...

 

A Classe é essa:

final class CN_Singleton{    private static $instance = array();    final private function __construct()    {}    public final function __clone()    {        trigger_error('Nao é possivel clonar uma classe singleton', E_USER_ERROR);    }    static public function &factory($className)    {        if(!isset(self::$instance[$className]))        {            self::$instance[$className] = new $className;        }        return self::$instance[$className];    }}

 

No método "factory", existe um "&" ali pra que?

 

Gostaria de saber para que serve isso em funções definidas?

 

 

A minha outra dúvida é sobre visibilidade de métodos e variaveis, entendi que posso declarar como public,

private e protected, a questão é:

 

Em que ocasião eu devo usar cada padrão deste? se alguem puder citar algum exemplo serei grato, não precisa postar código , só informar que já me ajuda!

 

Se alguem puder me ajudar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala garoto!!

 

Nao sei qual o seu nivel de conhecimento em programacao,

entao vou tentar ser claro, ok?

Desculpe se falar algo que você ja sabe...

 

Isso eh uma passagem de parametro por REFERENCIA. Alem desse tipo,

temos a passagem por VALOR.

 

A diferenca entre as duas, esta na forma como ela trata os

parametros.

 

Na passagem por valor, o conteudo da variavel eh "copiado" pra

dentro da funcao/metodo, e esta variavel em si, nao eh alterada

quando a funcao terminar. Ja a passagem por referencia indica

a posicao dessa variavel na memoria, ou seja, altera diretamente

o seu valor.

 

Exemplo:

PHP
function quadrado($param){   // Sem '&', passagem por valor

       $param =  $param * $param;

       return $param;

  }

  $num = 2;

  echo "Numero ANTES da funcao:" .$num . "<br>";

  echo "Valor da funcao: ". quadrado($num)  . "<br>";

  echo "Numero DEPOIS da funcao:" .$num . "<br>";

  // aqui (se eu nao errei no codigo =]) as saidas vao ser:

  //  2

  //  4

  //  2

  function quadrado(&$param){   // Com '&', passagem por referencia

       $param =  $param * $param;

       return $param;

  }

  $num = 2;

  echo "Numero ANTES da funcao:" .$num . "<br>";

  echo "Valor da funcao: ". quadrado($num)  . "<br>";

  echo "Numero DEPOIS da funcao:" .$num . "<br>";

  // aqui (se eu nao errei no codigo =]) as saidas vao ser:

  //  2

  //  4

  //  4

 

Ou seja:

- voce tem uma variavel $a, e chama uma funcao (que altere o valor de $a) por VALOR, $a permanece

- voce tem uma variavel $a, e chama uma funcao (que altere o valor de $a) por REFERENCIA, $a tem seu valor alterado

 

Ufa!

Espero ter sido claro e nao repetitivo

:)

 

Qualquer duvida, eh so perguntar!

Abraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que a duvida dele

foi pq o & estava antes do nome da funcao, nao na area dos parametros

 

static public function &factory($className)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que fui claro...Bom, essa questao de visibilidade diz respeito a protecao deum metodo/atributo em relacao a outros objetos.Se eu nao to falando besteira, eh o tal do encapsulamento...

// Manual do PHPVisibilidadeA visibilidade de uma propriedade ou método pode ser definida prefixando a declaração com as palavras-chave: 'public','protected' ou 'private'. Itens declarados como public podem ser acessados por todo mundo. Protected limita o acesso a classes herdadas (e para a classe que define o item). Private limita a visibilidade para apenas a classe que define o item.

So lembrando que métodos sem qualquer declaração são definidas como public. beleza?Abraco!

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK; legal as respostas;Porém para que serve o "&" antes da função, e não como parametro?E outra coisa, poderiam citar um exemplo de em que situação tenho que declarar public ou etc...Tipo eu entendi o conceito mas não consigo entender o que tem que ser privado ou protegido.Valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK; legal as respostas;

 

Porém para que serve o "&" antes da função, e não como parametro?

 

E outra coisa, poderiam citar um exemplo de em que situação tenho que declarar public ou etc...

 

Tipo eu entendi o conceito mas não consigo entender o que tem que ser privado ou protegido.

 

Valew

Quanto a primeira questão, o Capítulo 21 do Manual irá lhe elucidar toda e qualquer dúvida no que tange referências (a propósito, o manual deve lhe servir de amuleto, ha ha ha).

 

Quanto a aplicabilidade de visibilidade de métodos, o próprio manual (Capítulo 19, item Visibilidade) a define de uma forma bem simples de entender:

 

Itens declarados como public podem ser acessados por todo mundo. Protected limita o acesso a classes herdadas (e para a classe que define o item). Private limita a visibilidade para apenas a classe que define o item.

Isto é, tudo depende da necessidade de cada membro. Se ele só vai servir internamente, na classe, deverá ser privado. Se terá de ser utilizado em qualquer situação, público. Por fim, só nos resta ser protegido, quando tiver de ser trabalhado na própria classe e nas classes que herdarem a mesma. Entendestes? O manual ajuda, viu?! ;)

 

[]s :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.