Ir para conteúdo

POWERED BY:

Arquivado

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

*_Charles Potter_*

POO - Extends

Recommended Posts

Ola gente,

 

Tenho uma class extend que quero que sete um valor na class principal, mas nao obtive sucesso,,

 

class pai
{
	public $nome;
}
class filho extends pai
{
	public function seta()
	{
		$this->nome = "xxxxxxxxx";
	}
}
$BaseA = new pai();
$BaseB = new filho();

$BaseB->seta();

echo $BaseA->nome;

Alguem sabe como fazer?

 

Seria:

- a class "filho" tem a função "seta", qando esta função for chamada ela deve setar o valo de uma variavel chamada "nome" que esta na class "pai"

Compartilhar este post


Link para o post
Compartilhar em outros sites


class pai{     
public $nome;
}
class filho extends pai{
        public function seta()       
 {        
        parent::seta();
        $this->nome = "xxxxxxxxx"; 
       }}
$BaseA = new pai();
$BaseB = new filho();
$BaseB->seta();
echo $BaseA->nome;

acho que é isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado gente,

 

Mas o "parent" chama uma função da class PAI. Neste caso deve retornar um erro Call to undefined method pai::seta() visto que na class pai não existe a função seta, tentei adiconar a função seta na class pai mas a variavel publica nao assumiu o valor desejado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado gente,

 

Mas o "parent" chama uma função da class PAI. Neste caso deve retornar um erro Call to undefined method pai::seta() visto que na class pai não existe a função seta, tentei adiconar a função seta na class pai mas a variavel publica nao assumiu o valor desejado

 

Tenta assim:

 

<?php
class pai{     
	protected $nome;
	
	protected function seta($nome){
		$this->nome = $nome;
	}
	public function getNome(){
		echo $this->nome;	
	}
}

class filho extends pai{
	public function seta($nome){
		parent::function seta($nome);	
	}	
}

$filho = new filho();
$pai = new Pai();
$filho->seta($nome);
$pai->getNome();
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não vejo o motivo de você querer fazer isso MAS parent funciona sim, desde que a variável seja estática (havia esquecido disso na resposta anterior).

 

<?php

class pai {
   public static $nome = 'Nome';
}

class filho extends pai {
   public function seta($nome) {
       parent::$nome = $nome;
   }
}

$BaseA = new pai();
echo 'Nome antigo ' . $BaseA::$nome;

$BaseB = new filho();
$BaseB->seta('Novo Nome');

echo '<br /><br />';

echo 'Novo nome: ' . $BaseA::$nome;

?>

 

A saída é o esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza cara,

 

assim tb nao funcionou, testei tb assim:

 

class pai{     
        protected $nome;
        
        protected function seta($nome){
                $this->nome = $nome;
        }
        public function getNome(){
                echo $this->nome;       
        }
}

class filho extends pai{
        public function seta(){
                parent::seta("teste");   
        }       
}

$filho = new filho();
$pai = new Pai();
$filho->seta();
$pai->getNome();

E tb nao funcionou,

O Interesante é que se eu mandar dar um echo no "$this->nome" logo ao ser criado retorna o valor

 

class pai{     
        protected $nome;
        
        protected function seta($nome){
                $this->nome = $nome;
				echo $this->nome;   // -> Desta forma retorna ( mas nao seria util para mim )
        }
        public function getNome(){
                echo $this->nome;       
        }
}

class filho extends pai{
        public function seta(){
                parent::seta("teste");   
        }       
}

$filho = new filho();
$pai = new Pai();
$filho->seta();
$pai->getNome();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw imagges,

 

Mas deu o erro:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in

 

Nas linhas:

echo 'Nome antigo ' . $BaseA::$nome;

echo 'Novo nome: ' . $BaseA::$nome;

 

Saberias o que ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você digitou o que eu postei ou copiou e colou?

 

Porque se você digitou linha a linha pode ser que tenha faltado algo e, por ser esse erro em hebreu, pode ser ausência da palavra-chave static.que está gerando erro na resolução do escopo.

 

Verifica de novo, e de novo, e de novo. Estou com o exemplo rodando aqui localmente e funcionando na boa.

 

P.S.: Quando solucionar direitinho, se quiser fazer aqueles setaNome() e pegaNome(), você pode condicionar com uma parâmetro nulo. Se for diferente de vazio, ele altera, se não for informado (continua nulo), retorna.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há meu ver o que estão tentando fazer está incorreto, se o filho é um extends do pai então quer dizer que ele herda todas as propriedades, sendo assim o nome deve ser exibido com $BaseB->nome, mas tirando isso a estrutura dos documentos é ilogica, com minha experiência o mais certo a se fazer seria isso:

 

abstract class pai{     

public $nome;
public $email;
public $data_cadastro;

// força a classe que estende a subclasse a definir estes metodos
abstract public function seta_nome($nome);
abstract public function seta_email($email);
abstract public function seta_data_cadastro($data_cadastro);

}

class filho extends pai {

public function seta_nome($nome) {
	$this->nome = $nome;
}

public function seta_email($email) {
	$this->email = $email;
}

public function seta_data_cadastro($data_cadastro) {
	$this->data_cadastro = $data_cadastro;
}

}

$objFilho = new filho();
$objFilho->seta_nome('Teste');

echo $objFilho->nome;

 

Se acesso todos os metodos e valores do pai pelo filho por que a necessidade de criar dois objetos???

 

Um exemplo real em um serviço que dei uma pausa agora para responder a essa pergunta:

abstract class Parceiros {

protected $_banco;
protected $_prefixo;
protected $_arr_dados;
protected $_tabela;
public $id_cliente;
public $tipo;
public $email;
public $senha;
public $data_cadastro;
public $situacao;

/**
 * 
 */
public function __construct() {

	$objBanco = new BancoFactory();

	$this->_banco = $objBanco->factory();

	return $this->_banco;

}

/**
 * força a classe que estende a subclasse a definir esse metodo
    */
abstract public function carregar_dados();

public function populate($entrada){

	$arr_atributos = array_keys($entrada);

	foreach ($arr_atributos AS $atributo):

		if(isset($entrada[$atributo])):

			// Corrigindo a data;
        	if(eregi('^data_', $atributo)):
	       		$this->$atributo = $this->corrigeFormatoData($entrada[$atributo]);
        	else:
				$this->$atributo = $entrada[$atributo];
        	endif;

		endif;

	endforeach;
}
}

 

uso esta classe parceiros como abstração pra dois tipos de parceiro, o parceiro fisico e o parceiro juridico

 

final class PessoaFisica extends Parceiros {

public $nome;
public $rg;
public $cpf;

/**
 * 
 */
public function __construct() {

	parent::__construct ();

}
}

 

e

 

final class PessoaJuridica extends Parceiros {

public $nome_fantasia;
public $razao_social;
public $inscricao_estadual;
public $cnpj;
public $contato;

/**
 * 
 */
public function __construct() {
	parent::__construct ();
}
}

 

Espero que tenha esclarecido o assunto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

-a class "filho" tem a função "seta", qando esta função for chamada eladeve setar o valo de uma variavel chamada "nome" que esta na class "pai"

 

Amigo,acho que o pessoal não conseguiu te ajudar até agora porque ninguémentendeu exatamente o que você está precisando, talvez se você disserqual o objetivo disso talvez fique mais fácil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm tipo o objetivo.

 

Tenho varias class que ja estao prontas, cada class cria um campo de tipo diferente, tipo um class cria campos de data, outra campos de mapa, etc.

Preciso que cada vez que essas class que criam campos fizerem seu papel, e criarem um campo, o retorno seja gravado em um array na class PAI que vai armazenar todos os campos gerados, para que ao fim, eu possa ( Por exemplo ) exibir todos com um foreach.

 

Thiago Lithium, não entendi vem como disese, mas neste caso as class abtratas podem ter seus valor NÂO Assumidos pelas "extends"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm tipo o objetivo.

 

Tenho varias class que ja estao prontas, cada class cria um campo de tipo diferente, tipo um class cria campos de data, outra campos de mapa, etc.

Preciso que cada vez que essas class que criam campos fizerem seu papel, e criarem um campo, o retorno seja gravado em um array na class PAI que vai armazenar todos os campos gerados, para que ao fim, eu possa ( Por exemplo ) exibir todos com um foreach.

 

Thiago Lithium, não entendi vem como disese, mas neste caso as class abtratas podem ter seus valor NÂO Assumidos pelas "extends"?

 

Agora entendi, mas olha só, posso até estar falando asneira mas creio que não:

 

Cada objeto filho que você criar extenderá o objeto pai, ou seja não existirá o objeto Pai em sí(objPai) existirá a possibilidade de se usar parametros e metodos do objeto pai no objeto filho.

 

Quando você cria o objeto Pai ele não é o mesmo que está no objeto Filho1, o mesmo se aplica aos outros objetos ou seja: objPai != objFilho1 != objFilho2 != objFilho3

Então acho impossível você usar da forma abaixo:

$ObjPai = new Pai;

$objFilho1 = new Filho1;
$objFilho1->nome = 'teste1';
$objFilho2 = new Filho2;
$objFilho2->nome2 = 'teste2';
$objFilho3 = new Filho3;
$objFilho3->nome3 = 'teste3';

echo $objPai->nome;
echo $objPai->nome2;
echo $objPai->nome3;

 

Acho que você conseguiria usar da seguinte forma:

 

$objPai = new Pai;

$objFilho1 = new Filho1;
$objFilho2 = new Filho2;
$objFilho3 = new Filho3;

$objPai->nome_filho1 = $objFilho1->nome;
$objPai->nome_filho2 = $objFilho2->nome;
$objPai->nome_filho3 = $objFilho3->nome;

var_dump($objPai);

 

Tipo ao invés de você fazer a amarração por extends você faça usando uma arquitetura modular que força o novo objeto criado a informar valores para o objeto pai, caso não aconteça Throw Exception.....

 

Acho que é isso...

 

PS.: Parei pra dar uma olhada no modo static no site do php e encontrei isso

 

<?php
class MyParent {

   protected static $variable;
}

class Child1 extends MyParent {

   function set() {

       self::$variable = 2;
   }
}

class Child2 extends MyParent {

   function show() {

       echo(self::$variable);
   }
}

$c1 = new Child1();
$c1->set();
$c2 = new Child2();
$c2->show(); // prints 2
?>

 

Creio que possa ser usado no seu caso também...

No mesmo contexto da anterior

 

<?php

 class MySingleton
 {
   private static $instance = null;

   private function __construct()
   {
     $this-> name = 'Freddy';

   }

   public static function getInstance()
   {
     if(self::$instance == null)
     {
       print "Object created!<br>";
       self::$instance = new self;

     }

     return self::$instance;

   }

   public function sayHello()
   {
     print "Hello my name is {$this-> name}!<br>";

   }

   public function setName($name)
   {
     $this-> name = $name;

   }

 }

 //

 $objA = MySingleton::getInstance(); // Object created!

 $objA-> sayHello(); // Hello my name is Freddy!

 $objA-> setName("Alex");

 $objA-> sayHello(); // Hello my name is Alex!

 $objB = MySingleton::getInstance();

 $objB-> sayHello(); // Hello my name is Alex!

 $objB-> setName("Bob");

 $objA-> sayHello(); // Hello my name is Bob!

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho varias class que ja estao prontas, cada class cria um campo de tipo diferente, tipo um class cria campos de data, outra campos de mapa, etc.

Preciso que cada vez que essas class que criam campos fizerem seu papel, e criarem um campo, o retorno seja gravado em um array na class PAI que vai armazenar todos os campos gerados, para que ao fim, eu possa ( Por exemplo ) exibir todos com um foreach.

 

Certo, nesse caso, tenta assim:

 

class Pai implements IteratorAggregate {
    static protected $storage = array();

    public function getIterator(){
        return( new ArrayIterator( self::$storage ) );
    }
}

class Filho1 extends Pai {
    public function setName( $name ){
        self::$storage[ 'name' ] = $name;
    }
}

class Filho2 extends Pai {
    public function setAge( $age ){
        self::$storage[ 'age' ] = $age;
    }
}

$pai = new Pai();
$teste1 = new Filho1();
$teste2 = new Filho2();

$teste1->setName( "Neto" );
$teste2->setAge( 27 );

foreach ( $pai as $key => $value ){
    printf( "A propriedade %s tem o valor %s\n" , $key , $value );
}

A saída deverá ser:

 

A propriedade name tem o valor Neto

A propriedade age tem o valor 27

 

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.