Ir para conteúdo
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
 

  • Gostei 1

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 */

 

 

  • Gostei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por DinhoPHP
      Olá!
      Estou com um problema jamais visto antes e nunca pensei que se tornaria um algum dia. Estou desenvolvendo um site, porém no arquivo index.php, ao ser enviado para o servidor da Hostgator, tudo que está em uma tag PHP em diante é ignorado, inclusive tags HTML5. No arquivo, há tags PHP antes dessa e são interpretadas tanto no XAMPP quanto na Hostgator, já a "tag problemática", funciona normal no XAMPP, porém não Hostgator. Segue o código, marquei o trecho ignorado pelo servidor, com uma linha de comentário em HTML5.
       
      index.php
      <!DOCTYPE html> <html lang="pt-br"> <head> <title>Royal Poker</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- ESTILO CSS DO PROGRAMADOR --> <link rel="stylesheet" href="_css/estilo_adicional.css"> <!-- DEPENDÊNCIAS DO BOOTSTRAP ONLINE DE ESTILO --> <!--<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">--> <!-- DEPENDÊNCIAS OFFLINE --> <link rel="stylesheet" href="node_modules/bootstrap/compiler/bootstrap.css"> <link rel="stylesheet" href="_css/main.css"> </head> <body> <div class="container-fluid fixed-top" style="z-index: 9999;"> <ul id="estados" class="navbar-nav fixed-top justify-content-start flex-row" style="background-color: #b4954f; font-size: 12px;"> <li> <a href="http://www.h2club.com.br" target="_self" class="navigation-link atual"> SÃO PAULO </a> </li> <li> | </li> <li> <a href="http://campinas.h2club.com.br" target="_self" class="navigation-link "> CAMPINAS </a> </li> <li> | </li> <li> <a href="http://curitiba.h2club.com.br" target="_self" class="navigation-link "> CURITIBA </a> </li> </ul> </div> <?php require_once"_include/menu_top.php";?> <div class="content-fluid" style="margin-top: 6rem;"> <?php require_once"_include/slide_top.php"; ?> </div> <div class="content-fluid text-uppercase text-center" style="margin-top: 6rem;"> <img src="_imagens/logo-rewards-meio.png" class="img-fluid" alt=""> <h2>PROGRAMA DE RECOMPENSAS DO H2 CLUB</h2> <h4>Acumule pontos enquanto joga Poker e troque por muitos prêmios e benefícios</h4> </div> <div class="flex-column w-100 justify-content-center text-uppercase text-justify"> <?php require_once"_include/opcoes_meio.php"; ?> </div> <div class="content-fluid justify-content-center"> <img src="_imagens/banner_meio.jpg" class="img-fluid" alt=""> <!-- TUDO É IGNORADO PELA HOSTGATOR E NÃO NO XAMPP --> <?php require_once"_include/calendario.php"; ?> </div> <?php require_once"_include/calendario.php"; ?> <?php require_once"_include/footer.php"; ?> <!-- DEPENDÊNCIAS DO BOOTSTRAP ONLINE NESSA ORDEM E AQUI NO FIM DO BODY --> <!--<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>--> <!-- DEPENDÊNCIAS DO BOOTSTRAP OFFLINE NESSA ORDEM E AQUI NO FIM DO BODY --> <script src="_jquery/jquery-3.3.1.slim.min.js"></script> <script src="_bootstrap4_1_3/popper.js/dist/umd/popper.min.js"></script> <script src="_bootstrap4_1_3/_js/bootstrap.min.js"></script> <script> $(document).ready(function(){ $('[data-toggle="popover"]').popover(); }); </script> </body> </html>  
    • Por waguinho
      Estou fazendo um site que terá acesso de muitos usuários simultaneamente, terão trocas de itens, sorteios onde cada um pode usar a quantidade de tickets que quiser. Minha dúvida é a seguinte,
      existe um array global que pode ser compartilhado simultaneamente por quem está logado no site? Ou cada um no seu session e joga tudo pro bando de dados e depois trabalha com os dados?
      Alguma solução alternativa? JS java etc.. Obrigado!
    • Por hansleygladberg
      Tenho a classe conexão:
       
      class Conexao{ private $_host = 'localhost'; private $_user = 'root'; private $_pass = ''; private $_database = 'mg'; public $_con; public $conecta; function __construct() { $this->conecta(); } public function conecta() { $_con = mysqli_connect($this->_host, $this->_user, $this->_pass, $this->_database) or die("Erro ao conectar ao servidor &raquo; " . mysqli_error()); return $_con; } } E o arquivo da classe que insere dados:
       
      require_once 'Conexao.class.php'; $conecta = new Conexao(); class Cliente{ private $id, $nome, $endereco, $telefone1, $telefone2; protected $tabela = 'clientes'; public function getId(){ return $this->id; } public function getNome(){ return $this->nome; } public function setNome($nome){ $this->nome = $nome; } public function getEndereco(){ return $this->endereco; } public function setEndereco($endereco){ $this->endereco = $endereco; } public function getTelefone1(){ return $this->telefone1; } public function setTelefone1($telefone1){ $this->telefone1 = $telefone1; } public function getTelefone2(){ return $this->telefone2; } public function setTelefone2($telefone2){ $this->telefone2 = $telefone2; } public function insere(){ $query = "INSERT INTO clientes (nome, endereco, telefone1, telefone2, email) VALUES ('2', '3', '4', '5', '6')"; $query2 = mysqli_query($_con, $query); } }  
      Quando executo a função "insere" ela retorna que falta um dos parâmetros que no caso não consegue encontrar a variável "$_con".
      Estou apenas fazendo testes pra depois de 12 anos relembrar e me atualizar no PHP....  Mas não consegui acessar essa variável..
    • Por Pavolin
      Boa noite, 
      Estou aprendendo java na faculdade e tenho uma lista para fazer, me esforcei o fim de semana todo e conseguir só fazer algumas partes, peco por favor para vocês me ajudarem vou por minhas duvidas a seguir:
      1.Faça um programa que deverá ler e armazenar na memória um as informações das pessoas. Deverá ser criada uma classe Pessoa com os atributos nome, data de nascimento, peso e altura. Crie os métodos públicos necessários para sets e gets e também um método para imprimir todos dados de uma pessoa. Crie um método para calcular a idade da pessoa. Crie um método para calcular o índice de massa corporal (IMC) de uma pessoa seguindo a seguinte fórmula
                                       IMC=peso/〖altura〗^2 
      Deverá ser criada uma classe de teste para testar a chamada de todos os métodos.
      (neste problema consegui fazer a  classe pessoa mas faltando algumas coisas que esta comentada no código, e não consegui fazer a classe teste)
      "classe pessoa":
      [
      import java.util.Scanner;
      public class Pessoa{
          private static String nome;
          private static String dataNascimento;
          private static float altura;
          private static float peso;
          private static float idade;
          public static String getNome() {
              return nome;
          }
          public void setNome(String nome) {
              Pessoa.nome = nome;
          }
          public static String getDataNascimento() {
              return dataNascimento;
          }
          public void setDataNacimento(String dataNacimento) {
              Pessoa.dataNascimento = dataNacimento;
          }
          public static float getAltura() {
              return altura;
          }
          public void setAltura(float altura) {
              Pessoa.altura = altura;
          }
          public static float getPeso() {
              return peso;
          }
          public void setPeso(float peso) {
              Pessoa.peso = peso;
          }
          
          public static float getIdade() {
              return idade;
          }
          public static void setIdade(float idade) {
              Pessoa.idade = idade;
          }
          
          public static Scanner entrada;
          public static float imc;
          
          public static void main(String[] args) {
              entrada = new Scanner(System.in);
              
              System.out.println("Digite seu nome: ");
              nome = entrada.nextLine();
              
              System.out.println("Digite sua data de nacimento: ");
              dataNascimento = entrada.nextLine();
          
              System.out.println("Digite seu Peso: ");
              peso = entrada.nextFloat();
              
              System.out.println("Digite sua Altura: ");
              altura = entrada.nextFloat();
          }
          
          public void imc() {
              imc = altura * altura;
              imc = peso / imc;
          }
          
          // preciso de um metodo para calcular a idade do usuario que seria a data atual - a data de nacimento.
          // alocando na variavel idade.
          
          public static void main1(String[] args) {
              System.out.println("Seu nome e: " + nome);
              System.out.println("Sua altura e: " + altura);
              System.out.println("Seu peso e: " + peso);
              System.out.println("Sua idade e: " + idade);
              System.out.println("Seu IMC : " + imc);
          }
      }
      ]
      2- Escreva uma classe cujos objetos representam alunos matriculados em uma disciplina. Cada objeto dessa classe deve guardar os seguintes dados do aluno: matrícula, nome, 2 notas de prova e 1 nota de trabalho. Escreva os seguintes métodos para esta classe: calculaMedia - calcula a média final do aluno (cada prova tem peso 2,5 e o trabalho tem peso 2) calculaFinal calcula quanto o aluno precisa para a prova final (retorna zero se ele não for para a final). Deverá ser criada uma classe de teste para testar a chamada de todos os métodos.
      ( Neste eu consegui fazer a classe alunos, mas falta a classe calculaMedia , calculaFinal e a classe teste)
      "Classe aluno":
      [
      package Exercicio2;
      public class Alunos {
              private static String matricula;
              private static String nome;
              private static float nota1;
              private static float nota2;
              private static float trabalho;
              
              public static String getMatricula() {
                  return matricula;
              }
              public void setMatricula(String matricula) {
                  Alunos.matricula = matricula;
              }
              public static float getNota1() {
                  return nota1;
              }
              public void setNota1(float nota1) {
                  Alunos.nota1 = nota1;
              }
              public static String getNome() {
                  return nome;
              }
              public void setNome(String nome) {
                  Alunos.nome = nome;
              }
              public static float getNota2() {
                  return nota2;
              }
              public void setNota2(float nota2) {
                  Alunos.nota2 = nota2;
              }
              public static float getTrabalho() {
                  return trabalho;
              }
              public void setTrabalho(float trabalho) {
                  Alunos.trabalho = trabalho;
              }
      }
      ]
      3-Crie uma classe denominada Elevador para armazenar as informações de um elevador dentro de um prédio. A classe deve armazenar o andar atual (térreo = 0), total de andares no prédio (desconsiderando o térreo), capacidade do elevador e quantas pessoas estão presentes nele. A classe deve também disponibilizar os seguintes métodos: 
      construtor : que deve receber como parâmetros a capacidade do elevador e o total de andares no prédio (os elevadores sempre começam no térreo e vazio); 
      Entra : para acrescentar uma pessoa no elevador (só deve acrescentar se ainda houver espaço); 
      Sai : para remover uma pessoa do elevador (só deve remover se houver alguém dentro dele); 
      Sobe : para subir um andar (não deve subir se já estiver no último andar); 
      Desce : para descer um andar (não deve descer se já estiver no térreo); 
      Encapsular todos os atributos da classe (criar os métodos set e get).
      Deverá ser criada uma classe de teste para testar a chamada de todos os métodos.
      (Este eu não tenho a menor ideia de como fazer não conseguir fazer nada dele)
      4-Crie uma classe Televisao e uma classe ControleRemoto que pode controlar o volume e trocar os canais da televisão. O controle de volume permite: 
      •    aumentar ou diminuir a potência do volume de som em uma unidade de cada vez; 
      •    aumentar e diminuir o número do canal em uma unidade 
      •    trocar para um canal indicado; 
      •    consultar o valor do volume de som e o canal selecionado. 
      (Este eu consegui fazer as duas classes (Televisao e ControleRemoto) mas esta faltando algumas coisas que esta comentado nos codigos)
      "Classe televeisao":
      [
      package Exercicio4;
      public class Televisao {
          private static int canal;
          private static int volume;
          
          public static int getCanal() {
              return canal;
          }
          public static void setCanal(int canal) {
              Televisao.canal = canal;
          }
          public static int getVolume() {
              return volume;
          }
          public static void setVolume(int volume) {
              Televisao.volume = volume;
          }
          public void canal() {
              System.out.println(nextInt(99));
              // Nao sei se esta correto mas fiz esse metodo para limita os canais a no maximo 99.
              //necessito tambem de um metodo para quando o usuario por + aumentar o numeor do canal e - diminuir.
              // para ele ter duas opcoes ou pelo numero certo dele ou pelo + e -.
          }
          
          public void volume() {
              System.out.println(nextInt(100));
              // mesma coisa aki mas com o volume limitado a 100.
          }
          
          private char[] nextInt(int i) {
              return null;
          }
      }
      ]
      "classe controle remoto":
      [
      package Exercicio4;
      import java.util.Scanner;
      public class ControleRemoto {
          private static int consulta;
          private static Scanner entrada;
          public static int getConsulta() {
              return consulta;
          }
          public static Scanner getEntrada() {
              return entrada;
          }
          public static void setEntrada(Scanner entrada) {
              ControleRemoto.entrada = entrada;
          }
          
          public static void setConsulta(int consulta) {
              ControleRemoto.consulta = consulta;
          }
          
          public static void main(String[] args) {
              setEntrada(new Scanner(System.in));
              
          //O usuario ira colocar as informacoes ex: numero do canal que deseja trocar,
          // se deseja aumentar ou diminuir o volume (obs: tem dois jeitos de trocar de canal pelo numero ou por + e -)
          }    
          
          // um metodo para imprimir a confirmacao da entrada ex: voce trocou para o canal 5 , 
          // o volume da tv esta em 12.(que seria a parte de consulta)
      }
      ]
      sei que estou abusando aqui mas estou tendo dificuldades e preciso entregar logo e não me sobra tempo para fazer de semana.
      Desde já agradeço
    • Por Pavolin
      Bom dia,
       
      estou com dificuldade em um problema que tenho que resolver:
       
      Faça um programa que deverá ler e armazenar na memória um as informações das pessoas. Deverá ser criada uma classe Pessoa com os atributos nome, data de nascimento, peso e altura. Crie os métodos públicos necessários para sets e gets e também um método para imprimir todos dados de uma pessoa. Crie um método para calcular a idade da pessoa. Crie um método para calcular o índice de massa corporal (IMC) de uma pessoa seguindo a seguinte fórmula
      IMC = peso/altura²
      Deverá ser criada uma classe de teste para testar a chamada de todos os métodos
×

Informação importante

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