PHP
语言参考 | Language Reference

protected

Visibility

The visibility of a property, a method or (as of PHP 7.1.0) a constant can be defined by prefixing the declaration with the keywords public, protected or private. Class members declared public can be accessed everywhere. Members declared protected can be accessed only within the class itself and by inheriting and parent classes. Members declared as private may only be accessed by the class that defines the member.

Property Visibility

Class properties must be defined as public, private, or protected. If declared using var, the property will be defined as public.

Example #1 Property declaration

<?php /**  * Define MyClass  */ class MyClass {     public $public = 'Public';     protected $protected = 'Protected';     private $private = 'Private';     function printHello()     {         echo $this->public;         echo $this->protected;         echo $this->private;     } } $obj = new MyClass( echo $obj->public; // Works echo $obj->protected; // Fatal Error echo $obj->private; // Fatal Error $obj->printHello( // Shows Public, Protected and Private /**  * Define MyClass2  */ class MyClass2 extends MyClass {     // We can redeclare the public and protected properties, but not private     public $public = 'Public2';     protected $protected = 'Protected2';     function printHello()     {         echo $this->public;         echo $this->protected;         echo $this->private;     } } $obj2 = new MyClass2( echo $obj2->public; // Works echo $obj2->protected; // Fatal Error echo $obj2->private; // Undefined $obj2->printHello( // Shows Public2, Protected2, Undefined ?>

Note: The PHP 4 method of declaring a variable with the var keyword is still supported for compatibility reasons (as a synonym for the public keyword). In PHP 5 before 5.1.3, its usage would generate an E_STRICT warning.

Method Visibility

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

Example #2 Method Declaration

<?php /**  * Define MyClass  */ class MyClass {     // Declare a public constructor     public function __construct() { }     // Declare a public method     public function MyPublic() { }     // Declare a protected method     protected function MyProtected() { }     // Declare a private method     private function MyPrivate() { }     // This is public     function Foo()     {         $this->MyPublic(         $this->MyProtected(         $this->MyPrivate(     } } $myclass = new MyClass; $myclass->MyPublic( // Works $myclass->MyProtected( // Fatal Error $myclass->MyPrivate( // Fatal Error $myclass->Foo( // Public, Protected and Private work /**  * Define MyClass2  */ class MyClass2 extends MyClass {     // This is public     function Foo2()     {         $this->MyPublic(         $this->MyProtected(         $this->MyPrivate( // Fatal Error     } } $myclass2 = new MyClass2; $myclass2->MyPublic( // Works $myclass2->Foo2( // Public and Protected work, not Private class Bar  {     public function test() {         $this->testPrivate(         $this->testPublic(     }     public function testPublic() {         echo "Bar::testPublic\n";     }          private function testPrivate() {         echo "Bar::testPrivate\n";     } } class Foo extends Bar  {     public function testPublic() {         echo "Foo::testPublic\n";     }          private function testPrivate() {         echo "Foo::testPrivate\n";     } } $myFoo = new Foo( $myFoo->test( // Bar::testPrivate                  // Foo::testPublic ?>

Constant Visibility

As of PHP 7.1.0, class constants may be defined as public, private, or protected. Constants declared without any explicit visibility keyword are defined as public.

Example #3 Constant Declaration as of PHP 7.1.0

<?php /**  * Define MyClass  */ class MyClass {     // Declare a public constant     public const MY_PUBLIC = 'public';     // Declare a protected constant     protected const MY_PROTECTED = 'protected';     // Declare a private constant     private const MY_PRIVATE = 'private';     public function foo()     {         echo self::MY_PUBLIC;         echo self::MY_PROTECTED;         echo self::MY_PRIVATE;     } } $myclass = new MyClass( MyClass::MY_PUBLIC; // Works MyClass::MY_PROTECTED; // Fatal Error MyClass::MY_PRIVATE; // Fatal Error $myclass->foo( // Public, Protected and Private work /**  * Define MyClass2  */ class MyClass2 extends MyClass {     // This is public     function foo2()     {         echo self::MY_PUBLIC;         echo self::MY_PROTECTED;         echo self::MY_PRIVATE; // Fatal Error     } } $myclass2 = new MyClass2; echo MyClass2::MY_PUBLIC; // Works $myclass2->foo2( // Public and Protected work, not Private ?>

Visibility from other objects

Objects of the same type will have access to each others private and protected members even though they are not the same instances. This is because the implementation specific details are already known when inside those objects.

Example #4 Accessing private members of the same object type

<?php class Test {     private $foo;     public function __construct($foo)     {         $this->foo = $foo;     }     private function bar()     {         echo 'Accessed the private method.';     }     public function baz(Test $other)     {         // We can change the private property:         $other->foo = 'hello';         var_dump($other->foo         // We can also call the private method:         $other->bar(     } } $test = new Test('test' $test->baz(new Test('other') ?>

The above example will output:

string(5) "hello" Accessed the private method.

← Constructors and Destructors

Object Inheritance →

© 1997–2017 The PHP Documentation Group

Licensed under the Creative Commons Attribution License v3.0 or later.

https://secure.php.net/manual/en/language.oop5.visibility.php