php 面向对象访问控制 public,private,protected详解

 更新时间:2016年11月25日 15:07  点击:1721
文章利用举例说明了关于PHP5面向对象访问控制 Public,private,protected详细说明,有需要的朋友可以参考一下。

在PHP5中增强了面向对象的机制,加入了面向对象常见的public、private、protected这样的访问控制机制。从字面意思来理解:

Public 无疑是公共的意思,意思是说类本身和其外部的子类都可以访问这个属性或者方法;

Private 英文翻译过来就是私有的意思,只能是类本身在类的内部才能访问——实例化的对象句柄不能访问该属性和方法,子类也不能访问;

Protected 受保护的属性或者方法,这个属性或者是方法只能被类本身或者子类的内部访问,实例化的对象句柄不能访问。

现在我们举个例子来说这个问题。

假设有一个宝石博物馆的管理员 小李,把仓库中的宝石分为三个类别,红宝石,蓝宝石,绿宝石。并且划分了属性,红宝石是国家的任何人都可以参观标签为(public),蓝宝石管理员小李家族传下来的(protected),绿宝石是小李自己在山上见到的(private)。

那么我们可以这样认为:

public标签的红宝石,是国家的——全民所有,只要是合法的国家的公民都能够参看和拍照。

Protected 这个是受保护的,只有小李家族的人(小李的孩子或者孙子)在特定的房间里面才能参观和拍照,不准拿到房间外边看——太小气了!

Private 这个是私有的,小李不想让其他人知道,更不想让拍照了,所以只能供小李在小李的房间里看看而已,其他的人即使小李的孩子们都没有办法看到


实例

 代码如下 复制代码

<?php 

error_reporting(E_ALL); 

 

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>'; 

static function tank(){ 

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; 

echo $this->private; //private,内部可以调用 

echo $this->protected; //protected,内部可以调用 

$this->pri_function(); //private方法,内部可以调用 

$this->pro_function(); //protected方法,内部可以调用 

protected function pro_function(){ 

echo "you request protected function<br>"; 

private function pri_function(){ 

echo "you request private function<br>"; 

 

$test = test::tank(); 

echo $test->public; 

echo $test->private; //Fatal error: Cannot access private property test::$private 

echo $test->protected; //Fatal error: Cannot access protected property test::$protected 

$test->pub_function(); 

$test->pro_function(); //Fatal error: Call to protected method test::pro_function() from context 

$test->pri_function(); //Fatal error: Call to private method test::pri_function() from context 

 

?> 

 

 

<?php error_reporting(E_ALL);  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>';  }  static function tank(){  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;  echo $this->private;        //private,内部可以调用  echo $this->protected;      //protected,内部可以调用  $this->pri_function();      //private方法,内部可以调用  $this->pro_function();      //protected方法,内部可以调用  }  protected  function pro_function(){  echo "you request protected function<br>";  }  private function pri_function(){  echo "you request private function<br>";  } }  $test = test::tank(); echo $test->public; echo $test->private;    //Fatal error: Cannot access private property test::$private echo $test->protected;  //Fatal error: Cannot access protected property test::$protected $test->pub_function(); $test->pro_function();  //Fatal error: Call to protected method test::pro_function() from context $test->pri_function();  //Fatal error: Call to private method test::pri_function() from context  ?>

从上面的例子中,我们可以看出,
public: 可以class内部调用,可以实例化调用。
private: 可以class内部调用,实例化调用报错。
protected: 可以class内部调用,实例化调用报错。

<?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(); //子类和父类有相同名字的属性和方法,实例化子类时,子类的中的属性和方法会盖掉父类的。 

 

?> 

本文章简单的讲解一下关于php利用自身的函数对数组的元素值进行降序排序方法,有需要的参考下。


rsort() 函数对数组的元素按照键值进行逆向排序。与 arsort() 的功能基本相同。

注释:该函数为 array 中的单元赋予新的键名。这将删除原有的键名而不仅是重新排序。

如果成功则返回 TRUE,否则返回 FALSE。

可选的第二个参数包含另外的排序标志。

语法
rsort(array,sorttype)参数 描述
array 必需。输入的数组。
sorttype 可选。规定如何排列数组的值。可能的值:

SORT_REGULAR - 默认。以它们原来的类型进行处理(不改变类型)。
SORT_NUMERIC - 把值作为数字来处理
SORT_STRING - 把值作为字符串来处理
SORT_LOCALE_STRING - 把值作为字符串来处理,基于本地设置*。
 

*:该值是 PHP 4.4.0 和 5.0.2 新加的。在 PHP 6 之前,使用了系统的区域设置,可以用 setlocale() 来改变。自 PHP 6 起,必须用 i18n_loc_set_default() 函数。

例子

 代码如下 复制代码

<?php
$my_array = array("a" => "Dog", "b" => "Cat", "c" => "Horse");
rsort($my_array);
print_r($my_array);
?>输出:

Array
(
[0] => Horse
[1] => Dog
[2] => Cat
)
Like sort(), rsort() assigns new keys for the elements in array. It will remove any existing keys you may have assigned, rather than just reordering the keys.  This means that it will destroy associative keys.

$animals = array("dog"=>"large",  "cat"=>"medium",  "mouse"=>"small");
print_r($animals);
//Array ( [dog] => large [cat] => medium [mouse] => small )

rsort($animals);
print_r($animals);
//Array ( [0] => small [1] => medium [2] => large )

Use KSORT() or KRSORT() to preserve associative keys.

在任何开发语言中都会有一些自己的变量这些称系统变量或环境变量,有需要的朋友参考一下。

PHP环境变量主要有$GLOBALS[]、$_SERVER[]、$_GET[]、$_POST[]、$_COOKIE[]、$_FILES[]、$_ENV[]、$_REQUEST[]、$_SESSION[]。$_GET和$_POST主要针对FORM表单提交的数据,$_COOKIE和$_SESSION主要针对客户端游览器和服务器端会话数据。$_FILES主要针对文件上传时提交的数据,$_REQUEST主要针对提交表单中所有请求数组,包括$_GET、$_POST、$_COOKIE中的所有内容,你可以通过print_r函数分别输出$_REQUEST或者$_COOKIE等进行比较。

         $_SERVER变量
是一个包含服务器端相关信息的PHP全局环境变量,在PHP4.1.0之前的版本使用$HTTP_SERVER_VARS。


$_SERVER['PHP_SELF']

#当前正在执行脚本的文件名,与 document root相关。在FORM表单中,如执行文件是本身,你可以在ACTION中使用

$_SERVER['QUERY_STRING']

#获取查询语句,即获取的是url串中’?'后面的值

$_SERVER['DOCUMENT_ROOT']

#当前运行脚本所在的文档根目录。在服务器配置文件中定义。

$_SERVER['HTTP_ACCEPT']

#当前请求的 Accept: 头部的内容。

$_SERVER['HTTP_ACCEPT_CHARSET']

#当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。

$_SERVER['HTTP_ACCEPT_ENCODING']

#当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。

$_SERVER['HTTP_ACCEPT_LANGUAGE']

#当前请求的 Accept-Language: 头部的内容。例如:“en”。

$_SERVER['HTTP_CONNECTION']

#当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。

$_SERVER['HTTP_HOST']

#当前请求的 Host: 头部的内容。

 $_SERVER['HTTP_REFERER']

#链接到当前页面的前一页面的 URL 地址。

$_SERVER['HTTP_USER_AGENT']

#当前请求的 User_Agent: 头部的内容。

$_SERVER['SERVER_NAME']

         #当前运行的PHP程序所在服务器主机的名称。

$_SERVER['REQUEST_METHOD']

#访问页面时的请求方法,即GET、HEAD、POST、PUT。

$_SERVER['DOCUMENT_ROOT']

#当前运行的PHP程序所在的文档根目录。也就是PHP.INI文件中的定义。

$_SERVER['HTTP_REFERER']

#链接到当前页面的前一页面的URL地址。在页面跳转功能中非常有用。

$_SERVER['REMOTE_ADDR']

#正在浏览当前页面访问者的IP地址。

$_SERVER['REMOTE_HOST']

#正在浏览当前页面用户的主机名。

$_SERVER['REMOTE_PORT']

#正在游览的用户连接到服务器时所使用的端口。

$_SERVER['SCRIPT_FILENAME']

#当前执行脚本的绝对路径名。

$_SERVER['SERVER_PORT']

#服务器所使用的端口

$_SERVER['SCRIPT_NAME']

#包含当前脚本的路径。这在页面需要指向自己时非常有用。

$_SERVER['REQUEST_URI']

#访问此页面所需的URI。如“/index.html”。

$_SERVER['PHP_AUTH_USER']

#应用在HTTP用户登录认证功能中,这个变量是用户输入的用户名。

$_SERVER['PHP_AUTH_PW']

#应用在HTTP用户登录认证功能中,这个变量便是用户输入的密码。

$_SERVER['AUTH_TYPE']

#应用在HTTP用户登录认证功能中,这个变量便是认证的类型。

$_SERVER['SERVER_SOFTWARE']
#服务器标识的字串,在响应请求时的头部中给出。

  系统常量
__FILE__ 当前PHP程序脚本的绝对路径及文件名称

__LINE__ 存储该常量所在的行号

__FUNCTION__ 存储该常量所在的函数名称

__CLASS__ 存储该常量所在的类的名称

PHP_VERSION 存储当前PHP的版本号,也可以通过PHPVERSION()函数获取。

PHP_OS 存储当前服务器的操作系统

本文章介绍了一两种在php中字符比较方法一种是==号,一种是strcmp函数进行字符串相等比较,有需要的朋友可以参考下。

利用函数strcmp()函数字符串进行比较


int strcmp(string str1,string str2))
参数str1和参数str2制定要比较的两个字符串,如果相等则返回0;如果参数str1大于参数str2则返回值大于0;如果参数str1小于参数str2则返回值小于0。

实例:

 代码如下 复制代码
<?php
$str1=”a”;    //定义字符串常量
$str2=”b”;    //定义字符串常量
$str3=”ccc”;          //定义字符串常量
$str4=”CCC”;          //定义字符串常量
echo strcmp($str1,$str2);//这两个字符串相等
echo strcmp($str3,$str4);//注意该函数区分大小写
?>

注意:该函数区分字母大小写。

利用==进行比较

 代码如下 复制代码

$a = "joe";
$b = "jerry";
if ($a != $b)
{
    echo "不相等";
}
else
{
    echo "相等";
}

更多详细内容请查看:http://www.111cn.net/phper/php-function/35413.htm

在php中循环语句我们常用的就几种,while,do while ,for(),foreach这四种,也是大家开发中常用到的循环语句了,有需要的朋友可以参考一下,本教程一一来讲一下这种语句的用法。

Foreach语句
Foreach循环是php4.0引进来的,只能用于数组。在php5中,又增加了对对象的支持。该语句的语法格式为:
foreach(array_expression as $value)
statement;

 代码如下 复制代码

Foreach(array_expression as $key => $value)
statement;


FOREACH ($array_variable as $value)
{
  [code to execute]
}

or

FOREACH ($array_variable as $key => $value)
{
  [code to execute]
}

在这两种情况下,多次[代码执行]将被处死是等于在$ array_variable数组元素的个数。

让我们来看一个例子。假设我们有下面的代码段:

 

 代码如下 复制代码

$array1 = array(1,2,3,4,5);
FOREACH ($array1 as $abc)
{
  print "new value is " . $abc*10 . "<br>";
}

输出结果

new value is 10
new value is 20
new value is 30
new value is 40
new value is 50

foreach循环以上经历了所有5个元素的数组$ array1,每次打印出一份声明中含有10倍的数组元素的值。
foreach作用是遍历当前数组的所有值出来并且赋给$var

再来看一个foreach 对多维数据操作实例

 代码如下 复制代码

 $s = array(array(1,2),array(3,4),array(5,6));
 foreach( $s as $v => $_v )
  {
   foreach( $_v as $vc => $_vc )
   {
    echo $_vc[0],'|'.$_vc[1],'<br />';
   //print_r($_vc);
   }
  }


更多详细内容请查看:http://www.111cn.net/phper/18/foreach-foreach.htm


for语句

最基于的遍历

 代码如下 复制代码

<?php
/* example 1 */

for ($i = 1; $i <= 10; $i++) {
    echo $i;
}

/* example 2 */

for ($i = 1; ; $i++) {
    if ($i > 10) {
        break;
    }
    echo $i;
}

/* example 3 */

$i = 1;
for (; ; ) {
    if ($i > 10) {
        break;
    }
    echo $i;
    $i++;
}

/* example 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>


遍历数组

 代码如下 复制代码

<?php
/*
* This is an array with some data we want to modify
* when running through the for loop.
*/
$people = Array(
        Array('name' => 'Kalle', 'salt' => 856412),
        Array('name' => 'Pierre', 'salt' => 215863)
        );

for($i = 0; $i < sizeof($people); ++$i)
{
    $people[$i]['salt'] = rand(000000, 999999);
}
?>

下面再看while 与do while
While循环是php中最简单的循环语句,他的语法格式是:

 代码如下 复制代码
While (expression){
statement;
}

当表达式expression的值为真时,将执行statement语句,执行结束后,再返回到expression表达式继续进行判断。直到表达式的值为假时,才跳出循环。

 

 代码如下 复制代码

<?php
/* example 1 */

$i = 1;
while ($i <= 10) {
    echo $i++;  /* the printed value would be
                   $i before the increment
                   (post-increment) */
}

/* example 2 */

$i = 1;
while ($i <= 10):
    echo $i;
    $i++;
endwhile;
?>


Do…While语句
While语句还有一种形式的表示,Do…While.语法为:
Do{
statement;
}While(expression);
两者的区别在于:Do…While语句要比While语句多循环一次。
当While表达式的值为假时,While循环直接跳出当前循环,而Do…While语句则是先执行一遍程序块,然后再对表达式进行判断。


实例

 代码如下 复制代码

<?php
do {
    if ($i < 5) {
        echo "i is not big enough";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
   echo "i is ok";

    /* process i */

} while (0);
?>

[!--infotagslink--]

相关文章

  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • js如何打印object对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
  • 替换json对象中的key最佳方案

    本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
  • javascript self对象使用详解

    这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30
  • 理解JavaScript事件对象

    这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
  • Xml中使用foreach遍历对象实现代码

    这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
  • 解决SpringCloud Feign传对象参数调用失败的问题

    这篇文章主要介绍了解决SpringCloud Feign传对象参数调用失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-24
  • JS实现简单面向对象的颜色选择器实例

    这篇文章主要介绍了JS实现简单面向对象的颜色选择器,以完整实例形式分析了JavaScript基于面向对象实现颜色选择器的具体步骤与实现技巧,需要的朋友可以参考下...2016-04-23
  • vue - props 声明数组和对象操作

    这篇文章主要介绍了vue - props 声明数组和对象操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
  • 对象题目的一个坑 理解Javascript对象

    这篇文章主要介绍了Javascript对象,特别为大家分享了对象题目的一个坑,提供了解题思路,感兴趣的小伙伴们可以参考一下...2015-12-24
  • JavaScript Blob对象原理及用法详解

    这篇文章主要介绍了JavaScript Blob对象原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-14
  • Bootstrap媒体对象的实现

    在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04
  • HTML5 FileReader对象的具体使用方法

    这篇文章主要介绍了HTML5 FileReader对象的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • javascript创建对象的几种模式介绍

    下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
  • 浅谈JS正则RegExp对象

    这篇文章主要介绍JS正则RegExp对象,正则表达式是描述字符模式的对象,用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。下面就来看具体详情,需要的朋友可以参考一下...2021-10-21