php访问控制

访问控制(可见性)


对属性或方法的访问控制,是通过在前面添加关键字public(公有),protected(受保护)或private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

属性的访问控制


类属性必须定义为公有,受保护,私有之一。如果用var定义,则被视为公有。

#####属性声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php

/**
* 定义类 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; //这行能被正常执行
echo $obj->protected; //这行会产生一个致命错误
echo $obj->private; //这行也会产生一个致命错误
$obj->printHello(); //输出 Public(公有)、Protected(受保护) 和 Private(私有)


/**
* 定义类 MyClass2
*/
class MyClass2 extends MyClass
{
//可以对 public 和 protected 进行重定义,但 private 不能
protected $protected = 'Protected2(受保护)';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj2 = new MyClass2();
echo $obj2->public; //这行能被执行
echo $obj2->private; //未定义 private
echo $obj2->protected; //这行会产生一个致命错误
$obj2->printHello(); //输出 Public、Protected2(受保护)、和 Undefined

?>

方法的访问控制


类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

方法声明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
/**
*定义类 MyClass
*/
class MyClass
{
//声明一个公有的构造函数
public function __construct(){}

//声明一个公有的方法
public function MyPublic(){}

//声明一个受保护的方法
protected function MyProtected(){}

//声明一个私有的方法
private function MyPrivate(){}

//此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}

$myclass = new MyClass;
$myclass->MyPublic(); //这行能被正常执行
$myclass->MyProtected(); //这行会产生一个致命错误
$myclass->MyPrivate(); //这行会产生一个致命错误
$myclass->Foo(); //公有,受保护,私有都可执行

/**
*定义类 MyClass2
*/
class MyClass2 extends MyClass
{
//此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); //这行会产生一个致命错误
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); //这行能被正常执行
$myclass2->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";
}

$myFoo = new foo();
$myFoo->test(); //Bar::testPrivate
//Foo::testPublic

?>
-------------本文结束感谢您的阅读-------------
求打赏,多少都行
0%