Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Amigos tem como eu pegar um valor setado de uma classe pai na classe filha, tipo:
class pai
{
protected $valor = "teste!";
} function getMostra()
{
echo $this->valor;
}
}>
$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????!!!!
qual versão do php está usando ?
isso funciona normalmente:
<?php
class pai
{
protected $valor = "teste!";
} function getMostra()
{
echo $this->valor;
}
}
$r = new filho;
echo $r->getMostra();
?>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...-.-
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
>
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.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!";
} function getMostra()
{
echo self::$valor;
}
}
filho::getMostra();
?>>
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!";
} 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.
$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 {
class b extends a {