protected
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.
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com