php class中public,private,protected的区别以及实例分析

admin2017-06-111242

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

网友评论