php class中public,private,protected的区别以及实例分析
一、public,private,protected,Static的区别。
public 表示全局,类内部外部子类都可以访问;
private表示私有的,只有本类内部可以使用;
protected表示受保护的,只有本类或子类或父类中可以访问;
Static 表示类属性或方法为静态,就可以不实例化类而用 :: 直接访问。静态属性不能通过已实例化的对象来访问(但静态方法可以)。
二、调用实例。
<? //父类 class father{ public function a(){ echo "function a"; } private function b(){ echo "function b"; } protected function c(){ echo "function c"; } } //子类 class child extends father{ function d(){ parent::a();//调用父类的a方法 } function e(){ parent::c(); //调用父类的c方法 } function f(){ parent::b(); //调用父类的b方法 } } $father=new father(); $father->a(); $father->b(); //显示错误 外部无法调用私有的方法 Call to protected method father::b() $father->c(); //显示错误 外部无法调用受保护的方法Call to private method father::c() $chlid=new child(); $chlid->d(); $chlid->e(); $chlid->f();//显示错误 无法调用父类private的方法 Call to private method father::b() ?>
三、继承实例。
<?php class test { public $public; private $private; protected $protected; static $instance; public function __construct() { $this->public = 'public <br>'; $this->private = 'private <br>'; $this->protected = 'protected <br>'; } protected function tank() { //私有方法不能继承,换成public,protected if (!isset(self::$instance[get_class()])) { $c = get_class(); self::$instance = new $c; } return self::$instance; } public function pub_function() { echo "you request public function<br>"; echo $this->public; } protected function pro_function() { echo "you request protected function<br>"; echo $this->protected; } private function pri_function() { echo "you request private function<br>"; echo $this->private; } } class test1 extends test { public function __construct() { parent::tank(); parent::__construct(); } public function tank() { echo $this->public; echo $this->private; //Notice: Undefined property: test1::$private echo $this->protected; $this->pub_function(); $this->pro_function(); $this->pri_function(); //Fatal error: Call to private method test::pri_function() from context 'test1' } public function pro_extends_function() { echo "you request extends_protected function<br>"; } public function pri_extends_function() { echo "you request extends_private function<br>"; } } error_reporting(E_ALL); $test = new test1(); $test->tank(); //子类和父类有相同名字的属性和方法,实例化子类时,子类的中的属性和方法会盖掉父类的。 ?>
从上面的例子中,我们可以看出,
public: test中的public可以被继承。
private: test中的private不可以被继承。
protected:test中的protected可以被继承。
static: test中的static可以被继承。