anador 0 Denunciar post Postado Abril 30, 2009 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
eibon 2 Denunciar post Postado Abril 30, 2009 $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
anador 0 Denunciar post Postado Maio 1, 2009 $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
hinom 5 Denunciar post Postado Maio 2, 2009 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
eibon 2 Denunciar post Postado Maio 2, 2009 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
hinom 5 Denunciar post Postado Maio 2, 2009 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
anador 0 Denunciar post Postado Maio 2, 2009 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
hinom 5 Denunciar post Postado Maio 3, 2009 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
anador 0 Denunciar post Postado Maio 3, 2009 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