2015-07-21 2 views
8

J'ai étudié les nouvelles fonctionnalités de PHP7 et j'ai pensé que je pourrais commencer à préparer mon projet pour les nouvelles fonctionnalités qu'il introduit, comme les indicateurs de type scalaire.Recherche de type et constructeurs multiples

L'un des premiers problèmes que j'ai rencontrés a été mes constructeurs dans diverses classes. J'ai quelques contrustors génériques qui agit quelque chose comme ceci:

public function __construct($data = null) { 
    if (is_numeric($data)) { 
     $this->controller->createById($data); 
    } 
    elseif (is_array($data)) { 
     $this->controller->createByArray($data); 
    } 
    elseif (strlen($data) > 0) { 
     $this->controller->createByUrl($data); 
    } 
} 

Introducing type hinting pour cette méthode erreurs jeter bien sûr dans toutes les directions. Pour autant que je sache, PHP7 ne présente pas de support pour plusieurs constructeurs. Existe-t-il des moyens de contourner ce problème ou s'agit-il d'une des limitations de la langue?

+4

Ne pas introduire les indications de type pour cette méthode? –

+0

@ N.B. Ouais, je sais que c'est une possibilité, mais venant de OOP-background, j'aimerais vraiment que mon code soit entièrement orienté objet;) – OptimusCrime

+0

La programmation et la POO sont spécialement conçues pour résoudre les problèmes. Vous n'avez aucun problème à résoudre via la programmation, vous souffrez de TOC et maintenant vous avez confondu ce TOC avec la limitation de la langue. Malheureusement, ce n'est pas une limitation de la langue. C'est juste une épine dans votre côté parce que vous avez un constructeur stupide qui accepte n'importe quoi et maintenant vous voulez taper l'indice via 3 constructeurs quelle est la valeur. Est-ce vraiment "OOP"? Code complexe et stupide qui ne résout aucun problème? –

Répondre

6

Correct, c'est l'une des limitations de la langue. (et le strlen() > 0 de toute façon ne peut pas être vérifié par un type. Qu'Auto-moulages à chaîne ... de sorte que votre méthode permet tout sauf « », nul et faux?)

En général, il y a dans le projet de RFCs élargir la typehinting de PHP dans 7.1: https://wiki.php.net/rfc/union_types

Cela vous permettrait d'écrire int | float | array | string $data = null.

+0

Oui, j'avais peur. Merci d'avoir lié le RFC pour les types d'union. Dommage que PHP ne supporte pas plusieurs constructeurs, bien que ce soit quelque chose qui viendra dans les futures versions maintenant qu'il est plus pertinent qu'avant. Quoi qu'il en soit, merci pour une réponse claire à ma question. – OptimusCrime

+1

La surcharge des fonctions (la version généralisée de plusieurs constructeurs) ne viendra pas vraiment à PHP car il est impossible de résoudre les conflits, en particulier avec les types faibles (ou les types stricts). ... d'autant que 'declare (strict_types = 1)' est spécifique à l'appelant ... Comportement différent pour les différents modes de frappe? wat?!?]. C'est pourquoi nous allons plutôt le chemin des types d'union qui vous permettront exactement quoi faire. – bwoebi