Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 ?
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
?>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.
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.
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.
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
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.
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!
>
Se um método é invocado a partir da superclasse, use parent:: e não o nome da classe.
Comassim ? poderia dar um exemplo pratico ?
>
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.
>
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:
Tiago Souza Ribeiro
Agora sim ficou claro ! O Construtor trata de coisas predefinidas então né ?
Bruno, era uma outra abordagem sobre o que escreveu mas parece que já esta tudo esclarecido então deixa para lá.
belas respostas.
abraços
Se você quiser que a classe faça algo já na hora que é instanciada, então deve usar o construtor. Exemplo:
class 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