Pergunta

Existe alguma vantagem de usar __construct() em vez do nome da classe para um construtor em PHP?

Exemplo (__construct):

class Foo {
    function __construct(){
        //do stuff
    }
}

Exemplo (nomeado):

class Foo {
    function Foo(){
        //do stuff
    }
}

Tendo o método __construct (primeiro exemplo) é possível desde o PHP 5.

Tendo um método com o mesmo nome de classe como construtor (segundo exemplo) é possível a partir do PHP versão 4 até versão 7.

Foi útil?

Solução

Eu concordo com aparelho, a vantagem é que você não tem que renomeá-lo se você renomear sua classe. DRY.

Se você tem uma classe criança que você pode chamar

parent::__construct()

para chamar o construtor pai. Se mais baixo da faixa de alterar a classe as herda de classe criança, você não tem que alterar a chamada construção para o pai.

Parece uma coisa pequena, mas falta mudar o nome da chamada do construtor com seus pais classes poderiam criar erros sutis (e não tão sutis).

Por exemplo, se você inseriu uma classe em seu heirachy, mas se esqueceu de mudar as chamadas do construtor, você poderia começaram a chamar construtores de avós em vez de pais. Isso pode muitas vezes causar resultados indesejáveis ??que podem ser difíceis de aviso prévio.

Observe também que

A partir do PHP 5.3.3, métodos com o mesmo nome que o último elemento de um nome de classe namespaced deixarão de ser tratados como construtor. Esta mudança não afeta classes não-namespaced.

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

Outras dicas

__construct foi introduzido em PHP5. É a maneira que é suposto fazê-lo agora. Não tenho conhecimento de qualquer vantagens per se, apesar de tudo.

A partir do PHP manual:

Para compatibilidade com versões anteriores, se o PHP 5 não consegue encontrar uma função __construct () para uma determinada classe, ele irá procurar a função de construtor de estilo antigo, com o nome da classe. Efetivamente, isso significa que o único caso que teria problemas de compatibilidade é se a classe tinha um método __construct chamado () que foi usado para diferentes semântica

Se você estiver em PHP5 Eu recomendaria usar __construct para evitar fazer PHP olhar em outro lugar.

A principal vantagem que eu vejo para __construct, é que você não tem que mudar o nome de seu construtor se você mudar de nome da classe.

Hoje, a resposta aceita é obsoleto.

Mudar o nome de classes é uma prática ruim: você tem que lembrar o que e onde para mudar o nome toda vez que você atualizar para a versão mais recente. Às vezes (como usar Reflexão ou estrutura de dependência complexo) pode ser impossível sem refatoração radical. E esta é acidental complexidade você quer evitar. É por isso que namespaces foram introduzidas no PHP. Java, C ++ ou C # não use __construct, eles usam o nome do construtor e não há nenhum problema com eles.

A partir do PHP 5.3.3, métodos com o mesmo nome como o último elemento de uma namespaced nome da classe não serão mais tratadas como construtor. Esta mudança não afetam as classes não-namespace .

Exemplo

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function

Note que construtores nomeados não estão obsoletos (PHP 5.5 hoje). No entanto, você não pode prever que a sua classe não será usado em namespace, , portanto, __construct deve ser preffered.

Esclarecimento sobre a má prática mencionado acima (por Dennis)

Em algum lugar no seu código você pode usar ReflectionClass :: getName () ; quando você mudar o nome da classe, você precisa se lembrar de onde você usou Reflexão e verificar se o resultado getName() ainda é coerente na sua aplicação. Quanto mais você precisa se lembrar de algo específico, o mais provável algo é esquecido o que resulta em erros no aplicativo.

Os pais não podem ter o controle sobre todas as classes no mundo que depende deles. Se allow_url_include está habilitado, algum outro web pode estar usando o classe do seu servidor, o que pode falhar se você mudar o nome de alguma classe. É ainda pior em linguagens compiladas mencionados acima:. A biblioteca pode ser copiado e empacotado em outro código

Não há nenhuma razão por que mudar o nome de classe:

  • se os conflitos de nomes de classe, de uso namespaces
  • Se as mudanças de responsabilidade classe, derivar alguma outra classe em vez

aulas em PHP no namespace, o método com o mesmo nome deve ser evitado de qualquer maneira: intuitivamente que deve produzir um objeto criado a classe; se ele faz outra coisa, porque para dar-lhe o mesmo nome? Ele deve ser um construtor e nada mais. A questão principal é que o comportamento de tal método um depende do uso namespace.

Não há problema com construtores __construct em PHP. Mas não foi a idéia mais inteligente para alterar os construtores nomeados.

A melhor vantagem de usar __contruct() vez de ClassName() é ao estender classes. É muito mais fácil para parent::__construct() chamada em vez de parent::ClassName(), como é reutilizável entre as classes e os pais podem ser alteradas facilmente.

No seu exemplo Foo::Foo é às vezes chamado de PHP 4 ou construtor de estilo antigo, porque ele vem desde os dias do PHP 4:

class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}

PHP 4 construtores será desaconselhável, mas não removido em PHP 7. Eles já não será ser considerado como construtores em qualquer situação em PHP 8. compatibilidade Futuro é definitivamente um grande motivo para não usar esse recurso.

Em PHP 5 a vantagem seria que o desempenho seria melhor. Ele vai olhar para um construtor com o nome de __construct primeiro e se ele não encontrar isso, ele vai olhar para os construtores pelo nome de className. Então, se ele encontrar um construtor pela __construct nome ele não precisa procurar um construtor pelo nome className.

Bem, tem sido há alguns anos desde que esta questão foi perguntado, mas eu acho que tem que responder a este ainda, porque as coisas mudou e para os leitores no futuro eu quero manter as informações atualizadas!


Assim, em php-7 que irá remover a opção de criar o construtor como uma função com o mesmo nome que a classe. Se você ainda fazê-lo você receberá um E_DEPRECATED.

Você pode ler mais sobre esta proposta (a proposta for aceite) aqui: https://wiki.php.net/rfc/remove_php4_constructors

E uma citação de lá:

PHP 7 emitirá E_DEPRECATED sempre que um PHP 4 construtor é definido . Quando o nome do método corresponde ao nome de classe, a classe não é em um espaço, e um construtor PHP 5 (__construct) não está presente, então uma E_DEPRECATED será emitida. PHP 8 vai parar de emitir E_DEPRECATED e os métodos não será reconhecido como construtores.

Além disso, você não terá uma E_STRICT em php-7 se você definir um método com o mesmo nome da classe e um __construct().

Você pode ver isso também aqui:

PHP 7 também irá emissores de paragem E_STRICT quando um método com o mesmo nome que a classe está presente, bem como __construct.


Então, eu recomendo que você use __construct(), já que você terá menos problemas com isso no futuro.

compatibilidade

Encaminhar. Há sempre uma chance de que o código legado que resta na língua por causa trás de compatibilidade será removido em uma versão futura.

Se houver métodos __construct e método SameAsClassName então __construct será executado, o método SameAsClassName será ignorado.

Eu acho que a razão principal é que é a convenção de linguagem. Você não precisa forçar uma linguagem de agir como outra pessoa.

Quer dizer, em Objective-C você prefixar os construtores com -init, por exemplo. Você pode fazer o seu próprio construtor usando seu nome de classe, mas por quê? São ther alguma razão para usar esse esquema em vez da convenção de linguagem?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top