当前位置:首页 > 开发 > 编程语言 > PHP > 正文

php中绕人的类成员访问控制

发表于: 2011-03-25   作者:bardo   来源:转载   浏览次数:
摘要:         PHP5面向对象增加了类成员的访问控制。但是,这一点,表面上易于理解,但很多人实际是并不理解的。究其原因,主要是没有能够明白访问控制是如何定义的。         首先,PHP定义访问控制与传统面向对象一样,定立了三个分级权限,Public:

        PHP5面向对象增加了类成员的访问控制。但是,这一点,表面上易于理解,但很多人实际是并不理解的。究其原因,主要是没有能够明白访问控制是如何定义的。

        首先,PHP定义访问控制与传统面向对象一样,定立了三个分级权限,Public:公有,Protected:保护,Private:私有。同时,还有静态成员,实际是应当算是四个权限。或者说是六种组合。

        先分别介绍一下三个分级权限:

        Public:公有——实际就是开放的,只要是在应用中,任一地方,通过对象的实例,均可以对其访问。

        Protected:保护——仅对子类开放。这就是说,只有两个区域中能够访问到:其一,当前类的成员方法当中的代码。其二,通过继承当前类生成的子类中成员方法的代码。其它地方均是不可访问的。

        Private:私有——说白了,就是自己用的。这就是说只有当前类的成员方法中的代码可以访问。

        这里要注意一下:我说的是:“当前类的成员方法中的代码”。因此,并不限是普通方法,还是静态方法。所以,你在静态方法中创建一个当前类的实例,那么,此实例是能够访问到该私有方法的。

        为什么要这么做?这实际上是必须的。比如,设计模式中的单件模式,它是将构造函数私有化,然后在通常名为getInstance()的方法中判断此类有没有实例化。保证该类只有单例存在。

        所以,无论是:实例名->私有方法,还是$this->私有方法,均是可以访问的。但“实例名->私有方法”必须是在类的成员方法之中。这就是说:私有的访问代码只要求是在当前类的class{}之中,而不是在外面就可以访问。

        不妨再看看单例的实现代码:

       

class phpApp{
	static private $instance;
	private $name;
	private __contruct($name){
		$this->name=$name;
	}
	static public getInstance($name){
		if (!isset(self::$instance){
			//这里实际是访问的私有的构造函数
			self::$instance=new phpApp($name);
		}
		return self::$instance;
	}
}

         再说静态,静态实际上是,把数据或方法交给类。由类来掌管。上面单例模式中,由类来掌管的有两个,第一是保存类实例的变量:$instance,因为只能有一个,所以,由类来管理最合适。同样,getInstance方法也是,它要保证无论是否实例化,均能访问到。

        实际开发中,我们有时,不知此方法或此属性交给类好,还是交给实例好。不妨这样想一下,这仍是访问控制。为什么这么说呢?只要是交给类管理的静态属性或方法,那么,你的应用中永远只有一个。

        假如说,你做一个链表。那么,每一个节点都是一个类。链表中有一项属性,是配置数据$config,很多初学者就不清楚它要定义成静态的(static)。这就是一个基本常识错误。想一想,不管有多少节点,节点创建,或其中函数运行时,要用到的配置,当且仅当只需要一个,这就足够了。如果其配置仅希望构造函数时传入,则就可以定义为: static private $config, 也许,你会说:这样问题来了。我仍每次创建子节点时要传入配置呀。其实不是这样的。唯有根节点传入一次即可。这就是说:将这个参数设为可选参数,如果传入了,就保存,否则,就不保存。代码如下:

      

class node{
	static private $config;
	private $name;
	private __contruct($config = NULL){
		if ($config != NULL)
		self::$config=$config;
	}	
}

 

        相当简单吧。但如果没有弄明白时,可能还是不知怎么做。每个节点都保存配置,既浪费时间,也浪费空间!

php中绕人的类成员访问控制

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
类型的访问控制通过使用修饰符允许开发人员对类中成员的访问进行限制。这是PHP5的新特性,也是OOP语
成员访问属性: 1. 1.不可访问 2. 2.私有 3. 3.保护 4. 4.公有 一.基类与派生类有同名成员:(二义
<chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899" w:st="on"&g
php里面的类-----class XX{},通过类的定义,可以使用调用类里面的成员属性和成员方法。 对象---一
首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存
首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存
首先我必须承认访问一个类的私有成员不是什么好做法。大家也都知道私有成员在外部是不能被访问的。
首先我必须承认访问一个类的私有成员不是什么好做法。大家也都知道私有成员在外部是不能被访问的。
下面关于实例成员的说法,哪些是正确的?CD A.实例成员也被称为实例变量 B.实例成员属于类成员 C.实
在实例方法中如何获取该方法所属的类名、方法名、行数呢? 例子项目有两个类: package com.jn.bean
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号