首页 > 编程技术 > php

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

发布时间:2016-11-25 15:07

文章利用举例说明了关于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--]

您可能感兴趣的文章: