2010-02-08 14 views
89

Miré manual, pero parece que no puedo encontrar la respuesta.Visibilidad predeterminada de los métodos de clase en PHP

¿Cuál es la visibilidad predeterminada en PHP para los métodos sin una declaración de visibilidad? ¿Tiene PHP una visibilidad de paquete como en Java?

Por ejemplo, en el siguiente código, ¿es go() público o privado?

class test { 
    function go() { 
    } 
} 

La razón por la que se plantea es que he visto muchos constructores código escrito como function __construct() y algunos como public function __construct(). ¿Son equivalentes?

Respuesta

141

El valor predeterminado es público.

Los métodos de clase se pueden definir como públicos, privados o protegidos. Los métodos declarados sin ninguna palabra clave de visibilidad explícita se definen como públicos.

http://www.php.net/manual/en/language.oop5.visibility.php

+4

Lo mismo ocurre con las propiedades –

+0

Lo mismo ocurre con las constantes. – Kolyunya

18

El valor predeterminado es público. Es una buena práctica incluirlo siempre, sin embargo, las clases compatibles con PHP4 no tienen modificadores de acceso, por lo que es común no ver el uso de ellas en el código heredado.

Y no, PHP no tiene visibilidad de paquetes, principalmente porque hasta hace poco PHP no tenía paquetes.

+1

¿Por qué es "una buena práctica siempre se incluyen"? – Ian

+14

@Ian: Diría que "explícito es mejor que implícito" (como dice [Zen of python] (http://stackoverflow.com/questions/228181/the-zen-of-python)). Hace que otros programadores desperdicien ciclos cerebrales preguntándose si el constructor es privado o público o qué. Si la gente siempre usa modificadores de acceso, es posible que el póster original ni siquiera haya hecho esta pregunta. – User

+0

También debe tenerse en cuenta que, en idiomas como Java, si el paquete predeterminado es privado de paquete, uno siempre se pregunta si es de paquete privado por diseño, o el desarrollador simplemente olvidó especificarlo (especialmente cuando se trata de desarrolladores no tan senior) . Es por eso que el PMD incluye reglas como esta: https://pmd.github.io/pmd-5.5.2/pmd-java/rules/java/comments.html#CommentDefaultAccessModifier – Johnco

7

El valor predeterminado es público. El motivo probablemente sea la compatibilidad con versiones anteriores, ya que el código anterior espera que sea público (dejaría de funcionar si no fuera público).

Cuestiones relacionadas