Visibilité par défaut des méthodes de classe en PHP


118

J'ai regardé le manuel , mais je n'arrive pas à trouver la réponse.

Quelle est la visibilité par défaut en PHP pour les méthodes sans déclaration de visibilité? PHP a-t-il une visibilité sur les packages comme en Java?

Par exemple, dans le code suivant, est-il go()public ou privé?

class test {
  function go() {
  }
}

La raison pour laquelle j'ai demandé est que j'ai vu de nombreux codes de constructeurs écrits comme function __construct()et certains comme public function __construct(). Sont-ils équivalents?

Réponses:



22

La valeur par défaut est publique. C'est une bonne pratique de toujours l'inclure, mais les classes supportées par PHP4 sans modificateurs d'accès, il est donc courant de ne pas les utiliser dans le code hérité.

Et non, PHP n'a pas de visibilité sur les packages, principalement parce que jusqu'à récemment, PHP n'avait pas de packages.


16
@Ian: Je dirais parce que "explicite vaut mieux qu'implicite" (comme le dit le Zen de python ). Cela amène d'autres programmeurs à gaspiller des cycles cérébraux en se demandant si le constructeur est privé ou public ou quoi. Si les gens utilisaient toujours des modificateurs d'accès, l'affiche originale n'aurait peut-être même pas posé cette question.
Utilisateur

A noter également, sur des langages tels que Java, où la valeur par défaut est package-private, on se demande toujours si c'est package-private par conception, ou si le développeur a simplement oublié de le spécifier (surtout lorsqu'il s'agit de développeurs pas si expérimentés). C'est pourquoi PMD inclut des règles telles que celle-ci: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco

9

La valeur par défaut est publique. La raison est probablement la rétrocompatibilité car l'ancien code s'attend à ce qu'il soit public (il cesserait de fonctionner s'il n'était pas public).


Félicitations pour le raisonnement.
Guney Ozsan


1

En l' absence de visibilité mot - clé ( public, privateou protected) utilisés, les méthodes seront publiques . Mais vous ne pouvez pas définir les propriétés de cette manière. Pour les propriétés , vous devrez ajouter un mot clé de visibilité lors de la déclaration.

Pour les propriétés qui ne sont pas déclarées dans la classe et que vous lui attribuez une valeur à l'intérieur d'une méthode aura une visibilité publique.

<?php
class Example {
    public $name; 
    public function __construct() {
        $this -> age = 9; // age is now public
        $this -> privateFunction();
    }
    private function privateFunction() {
        $this -> country = "USA"; // this is also public
    }
}

0

function __construct()et public function __construct()fonctionne avec le même nom de méthode.

Si vous ne pouvez pas définir le préfixe d'un nom de méthode, il doit être par défaut public.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.