135

I looked at the manual, but I can't seem to find the answer.

What is the default visibility in PHP for methods without a visibility declaration? Does PHP have a package visibility like in Java?

For example, in the following code, is go() public or private?

class test {
  function go() {
  }
}

The reason I asked is that I've seen many constructors code written as function __construct() and some as public function __construct(). Are they equivalent?

1
  • DOCS in 2021: Class properties must be defined as public, private, or protected. If declared using var, the property will be defined as public.
    – jave.web
    Commented Jun 21, 2021 at 14:04

6 Answers 6

198

Default is public.

Class methods may be defined as public, private, or protected. Methods declared without any explicit visibility keyword are defined as public.

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

3
  • 14
    Same goes for properties
    – Marc.2377
    Commented Jan 11, 2017 at 19:52
  • 9
    Same goes for constants.
    – Kolyunya
    Commented Jan 31, 2018 at 14:46
  • 1
    This was changed over time, it's now "must" not a "may". Also usually you don't need public properties and lot of times it's a code smell.
    – jave.web
    Commented Jun 21, 2021 at 14:05
27

Default is public. It's a good practice to always include it, however PHP4 supported classes without access modifiers, so it's common to see no usage of them in legacy code.

And no, PHP has no package visibility, mainly because until recently PHP had no packages.

3
  • 18
    @Ian: I would say because "explicit is better than implicit" (as the Zen of python says). It causes other programmers to waste brain cycles wondering if the constructor is private or public or what. If people always used access modifiers the original poster might not even have asked this question.
    – User
    Commented Oct 15, 2012 at 21:27
  • Also of note, on languages such as Java, were the default is package-private, one always wonders if it's package-private by design, or the developer just forgot to specify it (specially when dealing with not-so-senior developers). That's why PMD includes rules such as this: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
    – Johnco
    Commented Jan 24, 2017 at 17:22
  • @User therefore Python made everything just public and do the whatever hack you want with it x)
    – jave.web
    Commented Jun 21, 2021 at 14:07
12

The default is public. The reason probably is backwards compatibility as old code expects it to be public (it would stop working if it weren't public).

1
  • Kudos for the reasoning. Commented Oct 1, 2018 at 13:42
7

Default visibility is PUBLIC

Source

2

When no visibility keyword (public,private or protected) used, methods will be public. But, you cannot define properties in this way. For properties, you will need to append a visibility keyword on declaration.

For properties which is not declared in the class and you assign a value to it inside a method will have a public visibility.

<?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() and public function __construct() works as same method name.

If you could not define the prefix for a method name, it should be by default public.

Not the answer you're looking for? Browse other questions tagged or ask your own question.