Visibilidad predeterminada de los métodos de clase en PHP

118

Miré el manual , pero parece que no puedo encontrar la respuesta.

¿Cuál es la visibilidad predeterminada en PHP para métodos sin una declaración de visibilidad? ¿PHP tiene 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 pregunté es que he visto muchos códigos de constructores escritos como function __construct()y algunos como public function __construct(). ¿Son equivalentes?

Yada
fuente

Respuestas:

179

El valor predeterminado es público.

Los métodos de clase pueden definirse 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

Precio de Jansen
fuente
11
Lo mismo ocurre con las propiedades
Marc.2377
7
Lo mismo ocurre con las constantes.
Kolyunya
22

El valor predeterminado es público. Es una buena práctica incluirlo siempre; sin embargo, PHP4 admite clases sin modificadores de acceso, por lo que es común ver que no se usan en el código heredado.

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

Johnco
fuente
16
@Ian: Yo diría porque "explícito es mejor que implícito" (como dice el Zen de Python ). Hace que otros programadores desperdicien ciclos cerebrales preguntándose si el constructor es privado o público o qué. Si las personas siempre usaran modificadores de acceso, es posible que el cartel original ni siquiera hubiera hecho esta pregunta.
Usuario
También es de destacar que en lenguajes como Java, donde el paquete predeterminado es privado, uno siempre se pregunta si es un paquete privado por diseño, o el desarrollador simplemente se olvidó de especificarlo (especialmente cuando se trata de desarrolladores no tan experimentados). Es por eso que PMD incluye reglas como esta: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco
9

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

Tomas Markauskas
fuente
Felicitaciones por el razonamiento.
Guney Ozsan
7

La visibilidad predeterminada es PÚBLICA

Fuente

Sasa
fuente
1

Cuando no se utilice una palabra clave de visibilidad ( public, privateo protected), los métodos serán públicos . Pero no puede definir propiedades de esta manera. Para propiedades , deberá agregar una palabra clave de visibilidad en la declaración.

Para las propiedades que no están declaradas en la clase y le asignas un valor dentro de un método, tendrán visibilidad pública.

<?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
    }
}
James.Valon
fuente
0

function __construct()y public function __construct()funciona con el mismo nombre de método.

Si no puede definir el prefijo para un nombre de método, debería ser público por defecto.

Gazi Anis
fuente