Ir para conteúdo

Arquivado

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

Mirian Almeida

Escopo de funções dentro de classe PHP

Recommended Posts

Já entendi que as variaveis criadas fora das funções não são enxergadas dentro delas, e é preciso utilizar a palavra global, e funciona! Ex:

<?php

    $texto = 'Olá';

    function mostrar()
    {
        global $texto;
        echo $texto;
    }

mostrar();

//imprime o Ola na tela

?>

 

MAS quando eu coloco a mesma coisa dentro de uma classe, nao funciona mais, o que eu faço?

Vaja o codigo

<?php

class teste {
    public $texto = 'Olá';

    public function mostrar(){
        global $texto;
        echo $texto;
    }
}

$a = new teste();
$a->mostrar();
//isso não imprime nada na tela, fica vazio

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Mirian Almeida,

Nesse caso você poderia acessar pela propriedade $this,
Exemplo:
 

<?php

class teste {
    public $texto = 'um valor padrão';


    public function mostrar(){
        echo $this->texto;
    }
}



$a = new teste();
$a->mostrar(); //um valor padrão


Vale a pena a leitura de cada um dos tópicos abaixo:
http://php.net/manual/pt_BR/language.oop5.php
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

$this = Refere-se a tudo que está dentro da classe com exceção de variáveis.

 

Fiz vários exemplos de acesso em classes aqui, qualquer dúvida é só perguntar

Spoiler

<?php
class teste {

    public $attrA = "Sou um atributo público";
    protected $attrB = "Sou um atibuto protegido";
    private $attrC = "Sou um atributo privado";
    private $attrd;

    /* Mostra com possibilidade de alterar um ATTR protegido */
    public function mostarProtegido($parametro = null) {
        if ($parametro) {
            $this->attrB = (string) $parametro;
        }
        return ($this->attrB);
    }

    /* Mostra um atributo privado */
    public function mostarPrivado() {
        return ($this->attrC);
    }

    /* Armazena uma variável criada em um método que pode ser utilizada em toda classe */
    public function trasportarVariavelPorAtributo() {
        $variavel = "Eu sou uma variável";
        $this->attrd = $variavel;
    }
    
    public function verVariavel() {
        $this->trasportarVariavelPorAtributo();
        return ($this->attrd);
    }

}

class extendFilha extends teste {

    private function alteraProtegido() {
        $this->attrB = "Sou um atributo protegido, mas posso ser modificado por classes filhas";
    }

    public function alterar() {
        $this->alteraProtegido();
        return ($this->attrB);
    }

}

$objetoA = new teste();

echo $objetoA->attrA; // Como o atributo é publico eu posso acessar-lo diretamente
$objetoA->attrA = "Modifiquei o atributo público";
echo "<br />";
echo $objetoA->attrA; // Mostro o público depois que modifiquei aqui mesmo
echo "<br />";
//echo $objetoA->attrB; /* ERRO não posso acessar algo protegido pela classe */
//echo $objetoA->attrC; /* ERRO não posso acessar algo privado da classe */

echo $objetoA->mostarProtegido(); // Mostro o protegido porque o método pode acessar
echo "<br />";
// Altero o protegido porque criei a condição para enviar parâmetro
echo $objetoA->mostarProtegido("Modifiquei o protegido");
echo "<br />";

echo $objetoA->mostarPrivado(); // Mostro o privado poque o método pode acessar
echo "<br />";

/* 
 * Nesse caso o método publico vai acessar o método privado que vai criar uma variável
 * e armazenar se valor em um atributo e retornar ele.
 * Note que uso do $this foi para acessar dessa vez um método privado
 */
echo $objetoA->verVariavel();

echo "<hr />";
$objetoB = new extendFilha();

echo $objetoB->attrA; // Como é uma classe filha posso acessar o publico da classe mãe
echo "<hr />";
echo $objetoB->mostarProtegido("Filha que modificou o protegido da mãe"); // A filha pode acessar o protegido da mãe

/* 
 * Como as classes filhas podem acessar o protegido da mãe ela também
 * pode alterar o comportamento da mãe nesse caso
 */
echo "<br />";
echo $objetoB->alterar();
// $objetoB->attrC /* ERRO isso é privado, só pode ser usado pela classe mãe */

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Negrito
      Olá,
       
      Estou quebrando a cabeça com o recurso Session_OnStart , pois eu gostaria que algumas paginas/arquivos .asp tivessem exceções.
       
      Criei o Global.ASA com o seguinte contexto:
       
      <SCRIPT RUNAT=Server Language="VBScript">
      Sub Session_OnStart
        startPage = "/default.asp"
        currentPage = Request.ServerVariables("SCRIPT_NAME")
        If strcomp(currentPage,startPage,1) then
          Response.Redirect("/default.asp")
        End If
      End Sub
      </SCRIPT>
       
      Ele funciona perfeitamente, quando tento acessar qualquer pagina ou subdiretorio diretamente pela URL, ele me joga para a pagina inicial.
       
      Porem, eu gostaria de ter exceções em alguns diretorios e paginas .ASP , onde eu gostaria de liberar o acesso direto ao digitar a URL.
       
      Alguem sabe me informar se é possivel ? 
       
      Obrigado.
       
       
    • Por k9studio
      Meus amigos tenho essa classe e
      quero passar uns dados vindo de BD
      seria:
      $client_id;
      $pay_url;;
      $secret;
       
       
      namespace Pay;
      class Pay {   
         public function Auth(){
                  $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $pay_url);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
              curl_setopt($ch, CURLOPT_POST, 1);
              curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
              //CURLOPT_USERPWD = client_id : Secret
              curl_setopt($ch, CURLOPT_USERPWD, $client_id . ':' . $secret);
              }
          }   
    • Por fnatan
      Olá galera, novato em PHP aqui.
       
      Fiz uma classe e gostaria de ler o valor de uma determinada variável, porém essa variável será alterada por alguns métodos enquanto ela estiver instanciada, mas quando leio o valor dela essas alterações não são visualizadas.
       
      segue exemplo:
       
      <?php $test = new classeTeste; echo "valor inicial de myVar: ".$test->myVar."</br>"; $test->alterar_myVar(); echo "myVar após chamada do método: ".$test->myVar."</br>"; class classeTeste { public $myVar = 1000; public function alterar_myVar(){ $myVar = 20000; echo "Valor myVar foi alterado para: ".$myVar." pelo método alterar_myVar</br>"; } } ?> Valeu e Abraço!
    • Por unset
      Olá, uma dúvida tenho uma classe que faz upload de imagens e cadastra no banco, como eu faço para executar uma outra classe ação função etc somente apos verificar que todo o upload dos arquivos foi realizado com sucesso?
    • Por Guss
      A programadora Cafiaspirina Cruz deseja que todos os elementos <h2> de sua página ganhassem a classe "titulo", para que depois a fonte dos <h2> pudesse ser modificada por um CSS,  deixando-os com um destaque específico. Escreva abaixo um código em Javascript para que todos os <h2> da página ganhem a classe "titulo" de uma única vez?
×

Informação importante

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