设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 公司 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

怎样理解PHP访问控制,有哪些知识点

发布时间:2023-01-05 08:36 所属栏目:121 来源:互联网
导读:跟大家讲解下有关如何理解PHP访问控制,有哪些知识点的内容 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了相关资料,希望小伙伴们看了有所帮助。 php访问控制的介绍 1. 属性的访问控制 php中,类的属性必须被定义为公有(public),受保护(protecte
  跟大家讲解下有关“如何理解PHP访问控制,有哪些知识点”的内容 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了相关资料,希望小伙伴们看了有所帮助。
 
  php访问控制的介绍
 
  1. 属性的访问控制
 
  php中,类的属性必须被定义为公有(public),受保护(protected),私有(private)三个中的一个。PHP4中可以用var关键词定义属性,默认未公有。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。
 
  对var关键词感兴趣的可以看一下http://stackoverflow.com/ques...
 
  class Foo()
 
  {
      $name = "hello world" # 这么写是错误的。属性必须定义访问控制 
  }
 
  2. 方法的访问控制
 
  同样,类中的方法也可以被定义为公有(public),受保护(protected),私有(private)三个中的一个。但是如果是公有,方法前的关键词public可以不写。即不写关键次,默认为公有。
 
  例如:
 
  class Bar()
 
  {
      function hello() # 此时该方法默认为公有
 
      {
          print("hello");
 
      }
 
  }
 
  那么如果把类中的构造函数私有话了会发生什么?例如:
 
  class Demo()
 
  {
      private function __construct()
 
      {
          print("I'm a private construct function");
 
      }
 
  }
 
  很显然,我们就不能直接用new Demo()来创建实例了,因为创建实例的时候会在外部调用__construct()方法。怎么办?我们或许可以在类里写一个静态方法来获取实例对象。这样就即是在本类中调用__construct()方法,也不用在外部实例化,简直完美!
 
  class Demo()
 
  {
      private function __construct()
 
      {
          print("I'm a private construct function");
 
      }
      public static function getInstance()

      {
          return new Demo();#这是Demo类内部,可以用new Demo()实例化调用私有的__construct()方法
 
      }
 
  }
 
  #在类外面,我们就可以这么玩了
 
  Demo::getInstance();
 
  但是话又说回来,我们先把__construct私有化,又千方百计用静态方法获取到实例。这是折腾什么鬼?
 
  其实在在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。
 
  如果我们需要在全局中只有一个唯一的对象,上面的代码还不够。因为只要有人调用了两次getInstance(),那么就生成了两个了。所以我们再把上面的代码改一下
 
  class Demo()
 
  {
 
      private function __construct()
 
      {
 
          print("I'm a private construct function");
 
      }
 
      # 先定义一个空成员装对象
 
      public $_object = null;
 
      public static function getInstance()
 
      {
 
          if(empty(self::$_object))
 
          {        
 
              # 如果没有创建过,那么就new一个
 
              return new Demo();
 
          }
 
          #否则(即以及创建过),我们只要放回已经存在的那个即可
 
          return $_object
 
      }
 
  }
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读