先贴出一张,直观的、估计大家都见过的关于public、protect、private的范围图

作用域
当前类
同一package
子孙类
其他package
public
    T
         T
    T
     T
protect
    T
         T
    T
     F
private
    T
         F
    F
     F

                          T : true    F : false

现在我就挑一个测试和验证一下,其他的都是根据上表可以推出来
这三个中,我觉得private算是相对较为复杂的,所以就选private吧!
1、子类不能继承和(直接)访问父类的私有属性和方法,
            a,如果企图在子类中修改父类的私有属性 $this->variable = val ;
      

   <?php
class test {
private $variable = 1;
public function setVal($param) {
$this->variable = $param;
}
public function getVal() {
return $this->variable;
}
private function output() {
echo 1;
}
}
class test2 extends test {
public function __construct(){
$this->variable =2;
}
}
$obj = new test2();
print_r($obj);
echo '<br />';
echo $obj->variable;
//$obj->output();
echo '<br />';
echo $obj->getVal();
echo '<br />';
$obj->setVal(3);
echo $obj->getVal();
echo '<br />';
print_r($obj);
}
?>

输出:

   test2 Object ( [variable:test:private] => 1 [variable] => 2 )

  2

  1

  3

  test2 Object ( [variable:test:private] => 3 [variable] => 2 )

可以看到,私有属性不能直接修改和覆盖,如果这样写只是给子类定义了一个属性,程序不会报错,只有通过父类给出的接口方法来设置父类的私有属性。
            b,或者企图覆盖父类的的私有属性 private variable = val;
            程序会报错,例如:
  <?php
class test {
private $variable = 1;
public function setVal($param) {
$this->variable = $param;
}
public function getVal() {
return $this->variable;
}
private function output() {
echo 1;
}
}
class test2 extends test {
public function __construct(){
//$this->variable =2;
private $variable = 2;
}
}
$obj = new test2();
print_r($obj);
echo '<br />';
echo $obj->variable;
//$obj->output();
echo '<br />';
echo $obj->getVal();
echo '<br />';
$obj->setVal(3);
echo $obj->getVal();
echo '<br />';
print_r($obj);
?>
   报错:
                    Parse error: syntax error, unexpected T_PRIVATE in D:\WWW\smarty_3\index.php on line 19
2、如果子类需要修改父类中的私有属性,必须在父类中提供修改的接口,也就是修改熟悉的公共方法
  

    <?php
class test {
private $variable = 1;
public function setVal($param) {
$this->variable = $param;
}
public function getVal() {
return $this->variable;
}
private function output() {
echo 1;
}
}
class test2 extends test {
public function __construct(){
$this->variable =2;
}
}
$obj = new test2();
print_r($obj); $obj->setVal(3);
echo $obj->getVal();
echo '<br />';
print_r($obj);
}
?>

  上班零时整理,结果还华丽丽的被领导看到了,尴尬死我了,格式没太顾得上,哎、、、、

 
 
 
 
 
 

public、protect、private在父类子类中使用的更多相关文章

  1. public protect private. 草稿。

    public protect private. 草稿. #include <iostream> #include <thread> #include <memory> ...

  2. C++中public/protect/private三种访问权限控制

    一.成员访问权限控制 1.public (1)public成员变量可以被成员函数访问  [访问性] (2)public成员可以被实体对象访问  [访问性] (3)public成员可以成为子类成员  [ ...

  3. public,protect,private访问权限

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问.不能被任何其他访问,该类的对象也不能访问. protect ...

  4. [C++]访问控制与继承(public,protect,private) 有时间再整理!!!

    http://www.cnblogs.com/chio/archive/2007/06/11/779408.html http://www.cnblogs.com/SelaSelah/archive/ ...

  5. C++中的Public 、Private、Protected 区别

    第一: private,public,protected的访问范围: private: 只能由该类的成员函数.友元的成员函数访问,不能被其他类的成员函数访问,即使是该类的对象也不能直接访问 publi ...

  6. Java中public、private、protect对数据成员或成员函数的访问限制

    Java类中对数据成员.成员函数的访问限制修饰有:public.protect.private.friendly(包访问限制) public修饰的数据成员或成员函数是对所有用户开放的,所有用户可以直接 ...

  7. java中public与private还有protect的区别

    java中public与private还有protect的区别 总是忘记.

  8. Ruby中类的进阶(继承,private, public, protect)

    类中的public,protect,private public method class Point def test end end 这样定义的test方法就是一个public方法可以在类内外使用 ...

  9. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

随机推荐

  1. 无DLL远程注入

    界面如下: 主要代码如下: #define STRLEN 20 typedef struct _DATA { DWORD dwLoadLibrary; DWORD dwGetProcAddress; ...

  2. .net4.0注册到IIS

    IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v4 ...

  3. POJ C程序设计进阶 编程题#1:寻找下标

    编程题#1:寻找下标 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 已知一 ...

  4. DataGridView取消默认选中行

    DataGridView在添加数据后会默认选中第 一个单元格或者第一行,我就想取消它的默认选中行.在DataGridView绑定数据之后加上了ClearSelection().这样一来,不论是启动窗体 ...

  5. silverlight 获取路径 config

    1.获取web.config配置内容: web.config default.aspx protected string InitParams { get; set; } InitParams = s ...

  6. hive到hbase的使用

    一.简单介绍 hive的元数据保存在metastore里面,真实的数据一般位于hdfs中,可以通过hql来对数据进行分析.hbase中的数据也是存放在hdfs上的,可不可以使用hive来分析hbase ...

  7. MongoDB(4):多种方式关闭服务命令

    http://blog.csdn.net/czw698/article/details/8791153 MongoDB 提供几种关闭服务的命令,具体为以下: 一 使用 Crtl+C 关闭  [mong ...

  8. Java 中的抽象类及接口

    抽象类使用 abstract 关键字修饰,该类即为抽象类. 抽象类的作用: 1.某些情况下,父类约束子类必须包含哪些方法,但不知道子类如何去实现这些方法. 2.可以从多个具有相同特征的类中抽象出一个抽 ...

  9. Java实现0~100之和

    经典问题了,三个变量分别表示起始.结尾以及和,for循环从起始到结尾,和不断累积.代码如下: public class ForLoop { public static void main(String ...

  10. 做个伪IE浏览器?!【来自官网】

    原文:docwiki.embarcadero.com/RADStudio/Seattle/en/Building_a_VCL_Forms_Web_Browser_Application 选择File ...