设为首页 收藏本站
查看: 485|回复: 0

[经验分享] php面向对象(OOP)编程完全教程:13.访问类型(public,protected,private)

[复制链接]

尚未签到

发表于 2015-8-26 09:46:03 | 显示全部楼层 |阅读模式
  类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性,但却是OOP语言的一个好的特性。而且大多数OOP语言都已支持此特性。PHP5支持如下3种访问修饰符
public (公有的、默认的),private (私有的)和protected (受保护的)三种.
  public 公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)这个类成员(包括成员属性和成员方法),在PHP5之前的所有版本中,PHP中类的成员都是public的, 而且在PHP5中如果类的成员没有指定成员访问修饰符,将被视为public 。例:
  


public $name;
public function say(){};  
  
  private 私有修改符,被定义为private的成员,对于同一个类里的所有成员是可见的,即是没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不能访问private修饰的成员。例:



private $var1 = 'A'; //属性
private function getValue(){} //函数
  
  protected保护成员修饰符,被修饰为protected的成员不能被该类的外部代码访问。但是对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的子类都不具有访问其属性和方法的权限。
例: protected $name;
protected function say(){};
  private
  protected
  public
  同一个类中
  √
  √
  √
  类的子类中
    √
  √
  所有的外部成员
  √
  
  

DSC0000.gif DSC0001.gif 代码

<?php
    /**
    * Define 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; // Works
    echo $obj->protected; // Fatal Error
    echo $obj->private; // Fatal Error
    $obj->printHello(); // Shows Public, Protected and Private

    /**
    * Define MyClass2
    */
    class MyClass2 extends MyClass
    {
        // We can redeclare the public and protected method, but not private
        protected $protected = 'Protected2';
        function printHello()
        {
          echo $this->public;
          echo $this->protected;
          echo $this->private;
        }
    }
    $obj2 = new MyClass2();
    echo $obj->public; // Works
    echo $obj2->private; // Undefined
    echo $obj2->protected; // Fatal Error
    $obj2->printHello(); // Shows Public, Protected2, not Private

?>   
  

代码

<?php
    /**
    * Define MyClass
    */
    class MyClass
    {
        // Contructors must be public
        public function __construct() { }
        // Declare a public method
        public function MyPublic() { }
        // Declare a protected method
        protected function MyProtected() { }
        // Declare a private method
        private function MyPrivate() { }
        // This is public
        function Foo()
        {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
        }
    }
    $myclass = new MyClass;
    $myclass->MyPublic(); // Works
    $myclass->MyProtected(); // Fatal Error
    $myclass->MyPrivate(); // Fatal Error
    $myclass->Foo(); // Public, Protected and Private work

    /**
    * Define MyClass2
    */
    class MyClass2 extends MyClass
    {
        // This is public
        function Foo2()
        {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // Fatal Error
        }
    }
    $myclass2 = new MyClass2;
    $myclass2->MyPublic(); // Works
    $myclass2->Foo2(); // Public and Protected work, not Private
?>   
  另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
例如,如果父类方法的访问权限是protected那么子类中要覆盖的权限就要是protected和public,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104343-1-1.html 上篇帖子: PHP开发经验总结 下篇帖子: 关于PHP的异步调用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表