资讯专栏INFORMATION COLUMN

php访问控制简介

zhaofeihao / 1309人阅读

摘要:属性的访问控制中,类的属性必须被定义为公有,受保护,私有三个中的一个。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。这是折腾什么鬼其实在在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。

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
    }
}

参考资料:http://www.imooc.com/code/543

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21884.html

相关文章

  • 2016-04-05【PHP简介、 Apache开发环境安装配置】

    摘要:的应用领域服务器端脚本主要作用应用程序图形界面命令行脚本文件路径或者脚本代码安装打开安装程序一路即可安装把压缩包解压到系统某一个目录中安装默认选项一路就行了配置与打开的文件增加以下内容解压目录中找到的路径添加如下内容检测配置语法配 PHP 的应用领域 web服务器端脚本:主要作用 应用程序图形界面 命令行脚本php.exe -f php文件路径 或者 php.exe -r p...

    LinkedME2016 评论0 收藏0
  • 2016-04-05【PHP简介、 Apache开发环境安装配置】

    摘要:的应用领域服务器端脚本主要作用应用程序图形界面命令行脚本文件路径或者脚本代码安装打开安装程序一路即可安装把压缩包解压到系统某一个目录中安装默认选项一路就行了配置与打开的文件增加以下内容解压目录中找到的路径添加如下内容检测配置语法配 PHP 的应用领域 web服务器端脚本:主要作用 应用程序图形界面 命令行脚本php.exe -f php文件路径 或者 php.exe -r p...

    amuqiao 评论0 收藏0
  • Kubernetes 简介

    摘要:对于应用,我们经常需要部署多个实例用于负载均衡,在,可以通过服务非常快速的创建一个内部负载均衡。这意味着是一个内部负载均衡器。因此,代表着流量入口和负载均衡的作用。 什么是Docker Docker不是虚拟机。 在很多的网络教案中喜欢将Docker与虚拟机进行类比,这种类比用于理解Docker的优势有着不错的作用,因为Docker与虚拟机有着相同的优势。但是从技术而言,虚拟机技术则是对...

    EasonTyler 评论0 收藏0
  • 大前端2018现在上车还还得及么

    摘要:面向对象三大特征继承性多态性封装性接口。第五阶段封装一个属于自己的框架框架封装基础事件流冒泡捕获事件对象事件框架选择框架。核心模块和对象全局对象,,,事件驱动,事件发射器加密解密,路径操作,序列化和反序列化文件流操作服务端与客户端。 第一阶段: HTML+CSS:HTML进阶、CSS进阶、div+css布局、HTML+css整站开发、 JavaScript基础:Js基础教程、js内置对...

    stormgens 评论0 收藏0

发表评论

0条评论

zhaofeihao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<