Ir para conteúdo

Arquivado

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

anador

[Resolvido] Acesso a propriedade de classe pai

Recommended Posts

Amigos tem como eu pegar um valor setado de uma classe pai na classe filha, tipo:

class pai
{
	   protected $valor = "teste!";
}
class filho extends pai
{
	  function getMostra()
	 {
			echo $this->valor;
	  }
}

do jeito que esta ele vai imprimir nada quando form chamado o metodo getMostra(), tem algum jeito que eu possa pegar o valor do atributo $valor na classe pai????

Compartilhar este post


Link para o post
Compartilhar em outros sites

$this faz referência a própria classe,e não a classe pai.Para ter-se uma referência da classe pai,usa-se parent::,que te dá acesso a métodos com o modificador public e protected da classe pai e acesso a seus parametros que sejam estaticos com o modificador public ou private.

Veja:

<?php
class a {
	public static $v = 'Hello';
	protected static $v1 = ' world ';
	private $v3 = 'of OOP with php!';
	
	public function getV3(){
		return $this->v3;
	}
};

class b extends a {
	public function ts(){
		return parent::$v.parent::$v1.parent::getV3();
	}
};

$b = new b();
echo $b->ts();
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

$this faz referência a própria classe,e não a classe pai.Para ter-se uma referência da classe pai,usa-se parent::,que te dá acesso a métodos com o modificador public e protected da classe pai e acesso a seus parametros que sejam estaticos com o modificador public ou private.

Veja:

<?php
class a {
	public static $v = 'Hello';
	protected static $v1 = ' world ';
	private $v3 = 'of OOP with php!';
	
	public function getV3(){
		return $this->v3;
	}
};

class b extends a {
	public function ts(){
		return parent::$v.parent::$v1.parent::getV3();
	}
};

$b = new b();
echo $b->ts();
?>
Valeu pela resposta amigo mas nao pegou o valor como voce mostrou nao; deixa-me expressar melhor!

tem o arquivo banco.class.php e nele tem a classe conexao e as classes filhas tipo select por exemplo.

no arquivo index.php e instanciei a classe conexao, e tambem instancio a classe select, eu estou fazendo a busca dos valores em um arquivo *.ini, e quero fazer isso so no class conexao, la tem uma propriedade de nome $tipo que recebe o tipo de sgbd e que eu estou fazendo essa classe para rodar tanto em postgre quanto mysql, para que eu nao fique setando o tipo nos metodos contrutores nas classes filhas eu quero pegar o valor do tipo direto na classe pai conexao, do modo que voce falou, parent::$tipo; nao traz nada, e eu ja instaciei a classe conexao no arquivo index.php

o que falta a fazer entao????!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual versão do php está usando ?

 

isso funciona normalmente:

 

<?php
class pai
{
	   protected $valor = "teste!";
}
class filho extends pai
{
	  function getMostra()
	 {
			echo $this->valor;
	  }
}

$r = new filho;
echo $r->getMostra();
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente...não tinha testado,e pelo membro ter falado que não funcionava acabei me esquecendo...

Desculpe o engano!

 

Ps: depois dessa...deu vontade até de aposentar...-.-

Compartilhar este post


Link para o post
Compartilhar em outros sites

o teste acima fiz com php 5.2.9

funcionou

 

agora no PHP 4.4.9

retornou erro:

 

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in .... line 4

 

precisa ver qual versao está usando

Compartilhar este post


Link para o post
Compartilhar em outros sites

o teste acima fiz com php 5.2.9

funcionou

 

agora no PHP 4.4.9

retornou erro:

 

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in .... line 4

 

precisa ver qual versao está usando

amigo a versao do php é a mesma que a sua, mas eu pelo que eu estudei ontem as apostilas do php nao tem jeito, como voces mostraram se voce instaciar a classe pai e setar valores para seus atributos.

vou mostrar o codigo aqui para ficar mais faciu!!

 

class conexao
	 {
		private $bank = ''; //atributo do nome do banco
		private $host = ''; //atributo do nome do local onde o banco esta
		private $port = ''; //atributo da porta de conexao
		private $user = ''; //atributo do usuario da conexao
		private $password = ''; //atributo da senha de acesso ao banco
		protected $conexao = ''; // atributo do resultado da conexao
		public $tipo = '';  // atributo do tipo de banco de dados pode ser postgres ou mysql
		private $dados = '';
		//metodo de construct que seta os valores para os atributos
		public function __construct($_arquivo)
		{
			if(file_exists($_arquivo))
			{
				$this->dados = parse_ini_file($_arquivo);
				$this->bank = $this->dados[ 'banco' ];
				$this->host = $this->dados[ 'host' ];
				$this->port = $this->dados[ 'port' ];
				$this->user = $this->dados[ 'user' ];
				$this->password = $this->dados[ 'password' ];
				$this->tipo = $this->dados[ 'tipo' ];
			}
		}
		//metodo destruct que destroi os valores dos atributos
		public function __destruct(){}
		//metodo de conexao ao banco de dados
		public final function setConecta()
		{
			if($this->tipo == "postgre")
			{
				$this->conexao = pg_connect("dbname = ".$this->bank." user = ".$this->user." password = ".$this->password." host = ".$this->host." port = ".$this->port);
				if(!$this->conexao)
					echo "Não foi possivel conectar ao banco";
			}
			else if($this->tipo == "mysql")
			{
				$this->conexao = mysql_connect($this->host,$this->user,$this->password);
				if($this->conexao)
					mysql_select_db($this->bank,$this->conexao);
				else
					echo "Não foi possivel conectar ao banco";
			}
		}
		//metodo que desconecta do banco de dados
		public final function setDesconecta($_conexao)
		{
			if($this->tipo == "postgre")
				pg_close($_conexao);
			else if($this->tipo == "mysql")
				mysql_close($_conexao);
		}
	 }
classe filha

//classe filha insercao que herda o tipo de banco da classe conexao
	 class insercao extends conexao
	 {
		private $tabela = ''; // atributo do nome da tabela
		private $campos = '';  //atributo dos campos da tabela
		private $valores = ''; //atributo dos valores dos campos
		private $resposta = ''; // atributo de retorno se os dados foram inseridos ou nao!
		private $sql = ''; //atributo da sql(foi criado para imprimir as sql's na tela para procurar erro
		//metodo de construct que seta os valores para os atributos
		public function __construct($_tipo,$_tabela,$_campos,$_valores)
		{
			$this->tipo = $_tipo;
			$this->tabela = $_tabela;
			$this->campos = $_campos;
			$this->valores = $_valores;
		}
		//metodo destruct que destroi os valores dos atributos
		public function __destruct(){}
		//metodo de insercao ao banco de dados
		public final function setInsert()
		{
			if($this->tipo == "postgre")
			{
				pg_query("START TRANSACTION");
				$this->sql = "INSERT INTO ".$this->tabela." ( ".$this->campos." ) VALUES ( ".$this->valores." ) ";
				$this->resposta = pg_query($this->sql);
				if($this->resposta)
					pg_query("COMMIT");
				else
					pg_query("ROLLBACK");
			}
			else if($this->tipo == "mysql")
			{
				mysql_query("START TRANSACTION");
				$this->sql = "INSERT INTO ".$this->tabela." ( ".$this->campos." ) VALUES ( ".$this->valores." ) ";
				$this->resposta = mysql_query($this->sql,$this->conexao);
				if($this->resposta)
					mysql_query("COMMIT",$this->conexao);
				else
					mysql_query("ROLLBACK",$this->conexao);
			}
		}
	 }

como voces observarao eu tive que setar o valor do tipo no construct da classe insercao, mas o ideal para mim e que ja que a classe conexao ja foi instanciada eu ja podia pegar o tipo de sgbd que ja esta setado, mas do modo que voces me mostraram que ao inves de colocar o $this->tipo; colocar parent::$tipo, nao deu certo ele nao pega valor nenhum, ou seja ela nao pega o valor que ja foi setado ao instanciar a classe conexao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Operador de Resolução de Escopo, também chamado de Paamayim Nekudotayim, ou em termos mais simples, dois pontos duplo, é um token que permite acesso a métodos ou membros estáticos, constantes, e sobrecarregados de uma classe

 

 

http://jp.php.net/manual/pt_BR/language.oo...nekudotayim.php

 

 

 

<?php
class pai
{
	   static $valor = "teste!";
}
class filho extends pai
{
	  function getMostra()
	 {
			echo self::$valor;
	  }
}

filho::getMostra();
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Operador de Resolução de Escopo, também chamado de Paamayim Nekudotayim, ou em termos mais simples, dois pontos duplo, é um token que permite acesso a métodos ou membros estáticos, constantes, e sobrecarregados de uma classe

 

 

http://jp.php.net/manual/pt_BR/language.oo...nekudotayim.php

 

 

 

<?php
class pai
{
	   static $valor = "teste!";
}
class filho extends pai
{
	  function getMostra()
	 {
			echo self::$valor;
	  }
}

filho::getMostra();
?>
Valeu hinom, eu cheguei a solução assim:

no atributo $tipo fiz essa alteraçao:

public static $tipo = '';
no construct da classe pai:

self::$tipo = $this->tipo;
e nas classes filhas, eu tirei o $this->tipo por:

parent::$tipo;

so assim, mesmo setado valores no construct que voce consegue pega o valor dele.

valeu, muito obrigado pela ajuda de voces, apesar de saber oop, tenho que aprender muito essas particularidades do php.

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.