PHP 手册 (类与对象) 学习笔记六:访问控制(可见性)
访问控制(可见性)
描述: 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问
属性的访问控制
描述: 类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
Example 1:属性声明
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
// $o = new MyClass();
// echo $o->public;//Public
// echo $o->protected;//致命错误
// echo $o->private;//致命错误
// $o->printHello();//PublicProtectedPrivate
class MyClass2 extends MyClass
{
//可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
// private $private = 'Private2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$o2 = new MyClass2();
echo $o2->public;//Public
// echo $o2->protected;//致命错误
// echo $o2->private;//致命错误
$o2->printHello();//PublicProtected2然后报undefined错误
Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告
方法的访问控制
描述: 类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
Example 2:方法声明
class MyClass
{
public function __construct(){ }
public function MyPublic()
{
echo "MyClass MyPublic\n";
}
protected function MyProtected()
{
echo "MyClass MyProtected\n";
}
private function MyPrivate()
{
echo "MyClass MyPrivate\n";
}
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass();
$myclass->MyPublic();//MyClass MyPublic
// $myclass->MyProtected();//报错
// $myclass->MyPrivate();//报错
$myclass->Foo();
/*
MyClass MyPublic
MyClass MyProtected
MyClass MyPrivate
*/
class MyClass2 extends MyClass
{
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();//报错
}
}
$o2 = new MyClass2();
$o2->MyPublic();//MyClass MyPublic
// $o2->Foo2();//公有的和受保护的都可执行,但私有的不行
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";
}
}
$foo = new Foo();
$foo->test();
/*
Bar::testPrivate
Foo::testPublic
*/
其他对象的访问控制
描述: 同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。
Example 3: 访问同一个对象类型的私有成员
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Accessed the private method.';
}
public function baz(Test $other)
{
$other->foo = 'hello';
var_dump($other->foo);
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
/*
string(5) "hello"
Accessed the private method.
*/
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: