首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
string(5) "hello"
Accessed the private method.

← Constructors and Destructors

Object Inheritance →

代码语言:txt
复制
 ? 1997–2017 The PHP Documentation Group

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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com