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可以被继承。
