php访问控制:public/protected/private
程序员文章站
2022-05-10 21:30:43
...
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。
一、属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
Example #1 属性声明
class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public.'<br>'; echo $this->protected.'<br>'; echo $this->private.'<br>'; } } $obj = new MyClass(); echo $obj->public; //这行可以正常运行 echo $obj->protected; //这行会产生一个致命错误 echo $obj->private; //这行也会产生一个致命错误 $obj->printHello(); //正常输出public、protected、private的值 class MyClass2 extends MyClass { 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、Protected和Undefined
Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。
方法的访问控制
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
Example #2 方法声明
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(); //公有,受保护,私有都可以执行 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<br>"; } private function testPrivate(){ echo "Bar::testPrivate<br>"; } } class Foo extends Bar { public function testPublic(){ echo "Foo::testPublic<br>"; } public function testPrivate(){ echo "Foo::testPrivate<br>"; } } $myFoo = new Foo(); $myFoo -> 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($this->foo); //我们也可以在这里调用私有的方法 $other->bar(); } } $test = new Test('test'); $test -> baz(new Test('other'));
输出结果:
string(4) "test"
Accessed the private method.
上一篇: php 输出网页版9*9乘法表
下一篇: 不为辗转千百度,只为等你灯火阑珊处
推荐阅读
-
php怎么判断成员函数的访问权限是public
-
php的public、protected、private三种访问控制模式的区别,protectedprivate_PHP教程
-
PHP 根据IP地址控制访问的代码
-
public、protected、private的区别
-
php如何控制用户对图片的访问 PHP禁止图片盗链,_PHP教程
-
php如何控制用户对图片的访问 PHP禁止图片盗链
-
PHP 关于访问控制的和运算符优先级介绍
-
浅析php面向对象public private protected 访问修饰符
-
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
-
php使用Cookie控制访问授权的方法