Ir para conteúdo

POWERED BY:

Arquivado

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

Matheus Lucca Carmo

[Resolvido] classe com construct

Recommended Posts

Olá galera , estou estudando OO e estou lendo o livro PHP:Programando com Orientação a Objetos do Pablo Dall'Oglio e me deparei com uma dúvida.

 

Quando eu crio uma classe , eu preciso criar o __construct dela ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quiser que a classe faça algo já na hora que é instanciada, então deve usar o construtor. Exemplo:

class ClasseX {
    public function __construct() {
         echo 'Construtor executado';
    }
}

new ClasseX;

Isso aí vai imprimir Construtor executado, que é o que você "disse" para a classe fazer quando for instanciada. Se não precisar fazer algo assim, então não precisa usar o __construct(). Basicamente é isso.

 

 

Referências:

http://www.mamura.com.br/metodos-magicos-do-php-__construct/

http://php.net/manual/en/language.oop5.decon.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não necessariamente, apenas se voce kiser emvocar um metodo ou definir o valor de algum objeto.

 

Voce pode estar usando o nome da class tambem.

<?php

class Nome{

protected $v;

public function Nome($valor){

	$this->v = $valor;

}

public function getV(){
	return $this->v;
}


}

class Outra extends Nome{

public function Outra($umvalor){
	parent::Nome($umvalor);

}

}

$v = new Outra('valor');
echo $v->getV(); //vai imprimir valor

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só completar a ideia do amigo.

 

Se você quiser que a classe faça algo já na hora que é instanciada, então deve usar o construtor.

 

isso esta correto.

 

apesar de tudo o __construct é um método só que ele é chamado de um método mágico e o que indica isso é o uso das 2 underscore ou underline(__) em frente a nomeclatura.

 

o método mágico construct é bem simples, ele vai executar aquele code na hora que é instanciada a classe sem a necessidade de chamar ele.

 

Eu tenho um Classe para disparo de emails e nessa classe eu uso o __construct para definir host, username, password pois são tipo de coisas que nós não alteramos muito, geralmente é um valor estático e então quando invoco minha classe eu só preciso definir a mensagem o email que vai receber, todos os outros dados tem seu valor padrão.

 

espero que tenha entendido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao meu ver existem alguns equívocos nas respostas dadas.

 

Primeiro: O construtor não é da classe, é do objeto que ela representará ao ser instanciada.

 

Segundo: O construtor, como o próprio nome já diz, serve para construir o objeto.

 

Construir um objeto, ao pé da letra, não tem absolutamente nada a ver com invocar algum método e sim tornar disponível durante o tempo de vida do objeto recursos para que ele desempenhe suas tarefas.

 

Porém, é deveras conveniente dividir uma determinada lógica em fragmentos de código, por isso que é muito comum vermos a invocação de um método no construtor.

 

O construtor também serve, seja diretamente nele ou num método à parte por ele invocado, garantir a integridade das informações passadas.

 

Quando construímos um objeto cujo construtor recebe outros objetos como argumentos, dá-se o nome de Injeção de Dependência e nesses casos a verificação de integridade é feita pelo próprio PHP, ao analisar o tipo do dado de entrada com o type-hint definido.

 

Quando o objeto é construído com argumentos de tipos primitivos ou ainda com argumentos mistos, que pode ser um tipo primitivo ou um ou mais objetos, casos que polimorfismo é complicado ou impossível, é no construtor que a "segurança" da classe começa.

 

Ao @01100011cc um alerta: Cuidado com essa abordagem pois ela amarra a herança à apenas umaúnica classe, anulando toda e qualquer possibilidade polimórfica.

 

Se um método é invocado a partir da superclasse, use parent:: e não o nome da classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Construir um objeto, ao pé da letra, não tem absolutamente nada a ver com invocar algum método

 

ainda é um método, não tem como ser outra coisa.

a diferença é que você não invoca, ela faz isso com a construção da classe.

 

O construtor, como o próprio nome já diz, serve para construir o objeto.

 

como você disse para o colega, cuidado com o que diz.

 

dizendo desse jeito a galera pode pensar que um construtor esta diretamente ligada a estrutura inteira do objeto sendo dependente, então vale a pena explicar que ele vai executar uma função a parte dentro do objeto dependendo apenas da instancia a não ser que você crie alguma regra para isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas respostas , ficou claro para mim o uso do __construct ,porém , vejam o exemplo :

 

<?php
class Pessoa {
   var $nome
   var $idade
   var $cpf

}

Ai , quando a pessoa usa está classe ela faz assim

 

$matheus = new Pessoa ;

$matheus->$nome = "Matheus Lucca" ;
$matheus->$idade = "17";
$matheus->$cpf = 21436598-54 ;

// É assim que é passado o dados para os atributos certo

 

A classe com construtor é assim

class Pessoa {
   var $nome
   var $idade
   var $cpf

function __construct($nome,$idade,$cpf) {
  $this->Nome = $nome ;
  $this->Idade = $idade ;
  $this->Cpf = $cpf ;

}

}

 

Então , quando a pessoa usa a classe com o método __construct fica assim

 

$matheus = new Pessoa("Matheus Lucca",17,21436598-54) ;

 

Está é a minha principal dúvida , é certo que fico muito mais fácil criar o objeto com o __construct , essa é a principal função dele ?

 

Valeu galera

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Matheus, essa é apenas uma das utilidades do construtor. Você pode fazer o que quiser com ele: pode executar algum outro método, realizar cálculos antes que outros métodos da classe sejam usados, etc... pode fazer o quiser.

Ah, você está fazendo errado aí a declaração das variáveis; a palavra chave var é dos primórdios de OOP em PHP, lá na versão 4 ainda. Não se usa mais isso, é errado, ao invés, use os modificadores de visibilidade, ex:

class ClasseY {
	private $var1; //uma variável com visibilidade private
	protected $var2; //uma variável com visibilidade protected
	public $var3; //uma variável com visibilidade public
}

E na hora da declaração de valores da variável/propriedade, não precisa adicionar o $ depois do ponteiro -> (isso só é necessário com estáticos, em que o ponteiro é :: ) :

$a = new ClasseY;
$a->var3 = 'valor';

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tiago Souza Ribeiro

Ele serve então para agilizar as coisas ?

 

E obrigado pelas dicas , já usei estes modificadores de visibilidade em Java, peguei o exemplo de um livro antigo , mas obrigado pela dica!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tiago Souza Ribeiro

Ele serve então para agilizar as coisas ?

 

E obrigado pelas dicas , já usei estes modificadores de visibilidade em Java, peguei o exemplo de um livro antigo , mas obrigado pela dica!

Já que você citou o Java, esse construtor do PHP faz a mesma coisa daquele em Java, que tu cria um método com o mesmo nome da classe, pode até criar construtores em PHP desse mesmo jeito.

 

Um exemplo prático:

class UsersSelector {

private $connection;

public function __construct(PDO $pdo_instance) {
         $this->connection = $pdo_instance;
}

public function select($columns) {
         return $this->connection->query("SELECT $columns FROM Users")->fetchAll(); //métodos query() e fetchAll() do PDO
}

}

$conn = new PDO('mysql:dbname=Banco;host=localhost', 'root', '123');
$selector = new UsersSelector($conn); //Passa a instância do PDO para o construtor. É necessária ter a instância do PDO para usar a outro(s) método(s) dessa classe, por isso passa-a no construtor, já deve estar pronto quando for usar outros métodos
$selector->select('login', 'id');

 

Sem o construtor, você teria que dar passar a instância do PDO declarando diretamente o valor da propriedade connection, e a pessoa que fosse usar aí podia se esquecer disso e acabar impossibilitando o uso da classe.

 

Espero que tenha entendido;

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ainda é um método, não tem como ser outra coisa.

a diferença é que você não invoca, ela faz isso com a construção da classe.

Me expressei mal. Não me referia ao método construtor e sim à métodos invocados dentro dele.

 

 

dizendo desse jeito a galera pode pensar que um construtor esta diretamente ligada a estrutura inteira do objeto sendo dependente, então vale a pena explicar que ele vai executar uma função a parte dentro do objeto dependendo apenas da instancia a não ser que você crie alguma regra para isso.

Quê? :huh:

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.