public、protect、private在父类子类中使用

先贴出一张,直观的、估计大家都见过的关于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 ;

      

 1   <?php
 2         class test {
 3              private $variable = 1;
 4              public function setVal($param) {
 5                   $this->variable = $param;
 6              }
 7              public function getVal() {
 8                   return $this->variable;
 9              }
10              private function output() {
11                   echo 1;
12              }
13         }
14     class test2 extends test {
15          public function __construct(){
16           $this->variable =2;
17          }
18     }
19     $obj = new test2();
20     print_r($obj);
21     echo ‘<br />‘;
22     echo $obj->variable;
23     //$obj->output();
24     echo ‘<br />‘;
25     echo $obj->getVal();
26     echo ‘<br />‘;
27     $obj->setVal(3);
28     echo $obj->getVal();
29     echo ‘<br />‘;
30     print_r($obj);
31     }
32 ?>                                

输出:

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

  2

  1

  3

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

可以看到,私有属性不能直接修改和覆盖,如果这样写只是给子类定义了一个属性,程序不会报错,只有通过父类给出的接口方法来设置父类的私有属性。

b,或者企图覆盖父类的的私有属性 private variable = val;

程序会报错,例如:

 1  <?php
 2                        class test {
 3  private $variable = 1;
 4  public function setVal($param) {
 5   $this->variable = $param;
 6  }
 7  public function getVal() {
 8   return $this->variable;
 9  }
10  private function output() {
11   echo 1;
12  }
13 }
14 class test2 extends test {
15  public function __construct(){
16   //$this->variable =2;
17   private $variable = 2;
18  }
19 }
20 $obj = new test2();
21 print_r($obj);
22 echo ‘<br />‘;
23 echo $obj->variable;
24 //$obj->output();
25 echo ‘<br />‘;
26 echo $obj->getVal();
27 echo ‘<br />‘;
28 $obj->setVal(3);
29 echo $obj->getVal();
30 echo ‘<br />‘;
31 print_r($obj);
32                     ?>

  报错:

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);
}
                    ?>

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

时间: 2024-10-15 12:11:18

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

public/protect/private和公有继承/保护继承/私有继承的简单理解

一.先来看一下没有继承的情况 类中的变量访问: (1)类内访问方式:通过public成员函数访问 (2)类外访问方式:直接访问 表 1 class A { public: int a; protected: int b; private: int c; public: int getAll(){ return a + b + c; } }; int main() { A testA; //类外访问方式 testA.a; testA.b; testA.c; //类内访问方式 testA.getAl

public,protect,private访问权限

第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问.不能被任何其他访问,该类的对象也不能访问. protected:可以被1.该类中的函数.2.子类的函数.以及3.其友元函数访问.但不能被该类的对象访问. public:可以被1.该类中的函数.2.子类的函数.3.其友元函数访问,也可以由4.该类的对象访问. 注:友元函数包括3种:设为友元的普通的非成员函数:设为友元的其他类的成员函数:设为友元类中的所有成员

public protect private

这个问题 应该很老了,但是确实是重点中的重点,如果没有真正的都用过这些修饰符,其实对其的作用并不深刻,我也没用过默认的修饰符,所以有时候也总把friendly和protected搞混,还因为这个丢失了一次很好的工作机会,随意今天又重新弄了一下跟大家分享,没事自己就看看. (1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. (2)对于protected修饰符,它主要的作用就是用来保

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

http://www.cnblogs.com/chio/archive/2007/06/11/779408.html http://www.cnblogs.com/SelaSelah/archive/2012/08/12/2634256.html http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/23/2514964.html http://bbs.csdn.net/topics/380193036 http://www.cnblogs.c

java 类继承,父类子类方法调用的过程d

1.Mytank类继承tank,则Mytank里面的公有部分即public 成员和方法在Mytank中是含有的可以调用和赋值,且在MyTank中不要有新的成员变量与tank中的公有成员名称一样,这样会发生调用紊乱,如: Tank tank = new MyTank(); int c = tank.a; 若 tank类中public a= 3: Mytank子类中新定义public a = 2: 则上述代码中的调用将会使得c = 3: 用了父类中的a.

java 类继承,父类子类方法调用的过程

1.Mytank类继承tank,则Mytank里面的公有部分即public 成员和方法在Mytank中是含有的可以调用和赋值,且在MyTank中不要有新的成员变量与tank中的公有成员名称一样,这样会发生调用紊乱,如: Tank tank = new MyTank(); int c = tank.a; 若 tank类中public a= 3: Mytank子类中新定义public a = 2: 则上述代码中的调用将会使得c = 3: 用了父类中的a.

在子类中,一定要访问父类的有参方法?

abstract class Person{ private int age; private String name; public Person(int age,String name){ this.age=age; this.name=name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name

继承实现的原理、子类中调用父类的方法、封装

一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--->A--->E--->B--->C. class E: def test(self): print('from E') class A(E): def test(self): print('from A') class B: def test(self): print('from B'

java中权限修饰符public、private、protected和default的区别

1.public 可以修饰类.成员变量和成员函数,没有任何限制,同一个包中,或者不同包中的类都可以自由访问 2.private 可以修饰成员变量和成员函数,只能在本类中使用 3.default (不写权限修饰符,就是default权限)可以修饰类.成员变量和成员函数,在同一个包中,可以自由访问.如果子类和父类不在同一个包中,子类可以继承到父类中的default权限的成员变量和成员函数,但是由于权限不够,无法使用 4.protected protected权限首先拥有和default一样的功能,但