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?

Respuestas:



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.


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).


Felicitaciones por el razonamiento.
Guney Ozsan


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
    }
}

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.