• 复习继承已有的类


    类的继承的例子:

     1 <?php
     2  class student
     3  {
     4      var $no;
     5      var $name;
     6      var $gender;
     7      var $age;
     8      
     9      function set_data($arr)
    10      {
    11          $this->no=$arr["no"];
    12          $this->name=$arr["name"];
    13          $this->gender=$arr["gender"];
    14          $this->age=$arr["age"];
    15          }
    16          
    17          function grow($i){
    18              $this->age+=$i;
    19              }
    20      function get_data(){
    21          echo"<br />
    22  <b>学生信息</b><br />
    23  ";
    24  echo "学号:$this->no<br />
    25  ";echo "姓名:$this->name<br />
    26  ";echo "性别:$this->gender<br />
    27  ";echo "年龄:$this->age<br />
    28  ";
    29          }
    30      }
    31  
    32 class college_student extends student{
    33     var $department;
    34 
    35     function change_department($new_department){
    36         $this->department=$new_department;
    37         }
    38     } 
    39 $s=new college_student;
    40      $temparr=array("no"=>"001","name"=>"lisa","gender"=>"male","age"=>"22");
    41 
    42  $s->set_data($temparr);
    43  $s->get_data();
    44  $s->department="物理系";
    45  echo "$s->name"."的所在系是$s->department<br />";
    46 $s->change_department("数学系");
    47   echo "$s->name"."的所在系是$s->department<br />";
    48     
    49     
    50    ?>

    子类 college_student 继承了它的父类student的全部属性和方法,并且子类在第33行又声明了一个自己的新属性。
    39行,实例化一个子类的对象,在42行、43行,这个子类对象调用了父类的两个方法,在地45行和47行里,子类对象调用了父类的属性以及它自己的新属性。

    运行显示:

    学生信息
    学号:001
    姓名:lisa
    性别:male
    年龄:22
    lisa的所在系是物理系
    lisa的所在系是数学系

    在编写代码的过程中,遇到一个问题,就是,如果将第47行的代码写成:

      echo "$s->name的所在系是$s->department<br />";

    那么就运行时,就会显示name属性未定义。这其实是与name属性没有关系的,而是echo的写法原因造成的,
    以下三种写法,程序会正常显示出来:

    (1) echo $s->name."的所在系是$s->department<br />";

    (2)echo "$s->name"."的所在系是$s->department<br />";

    (3)echo “所在系是$s->department<br />";

    这说明。如果echo 输出的第一个字符是一个变量的时候,要么用连字符”."把这个变量与后面的字符串分隔开,要么就把这个变量用""括起来并用连字符与后面的字符串相连接。如果echo输出的字符串中,变量所在的位子不在第一个字符,那么就无需使用连字符分隔。

    为了验证这个说法,我写了这样一段代码:

     1 <?php
     2 
     3 $foo = "foo";
     4 $bar = "bar";
     5 
     6 echo "Foo is $foo<br />";
     7 echo "$bar is bar<br />";
     8 echo "$bar"." is bar<br />";
     9 echo $bar." is bar<br />";
    10 echo "bar is $bar<br />";
    11    ?>

    那么这个程序,按照上面的说法,应该显示:

    Foo is foo
    错误提示,提示$bar未定义
    bar is bar
    bar is bar
    bar is bar

    可是实际,运行的结果却是:

    Foo is foo
    bar is bar
    bar is bar
    bar is bar
    bar is bar

    第二行可以正常运行出来,为了测试第二行,我把其它代码删除。

    <?php
    
    $bar = "bar";
    echo "$bar is bar<br />";
    
       ?>

    运行显示:

    bar is bar

    这说明,之前的猜测不对,这就奇怪了,为什么 echo "$s->name的所在系<br />";不能显示,而echo "$bar is bar<br />"; 却可以显示呢?

    我将$bar变量使用与$s->name变量相同的调用方法重新写一遍程序。

    将:

    <?php
    
    $bar = "bar";
    echo "$bar is bar<br />";
    
       ?>

    这段程序写为:

     1 <?php
     2 
     3 class test{
     4     var $bar;
     5     function give_content($con){
     6         $this->bar=$con;
     7                 }
     8     }
     9 
    10 $s=new test;
    11 $s->give_content("bar");
    12 echo "$s->bar is bar<br />";
    13 
    14    ?>

    看看这段程序运行后是什么效果?结果运行后依然正常:bar is bar

    这就说明,之前关于echo的猜测都不对,与echo输出的第一个字符没有关系,与对象调用的属性变量也没有关系。那么,难道问题出在类的继承上吗?

    下面我再写一个类的继承的程序,再来看一下运行后,是否有错误提示:

    <?php
    
    class test{
        var $bar;
        function give_content($con){
            $this->bar=$con;
                    }
        }
    
    
    class new_test extends test{}// new_test 继承test类,继承后,并不给予new_test 新的属性和新的方法
    $s=new new_test;
    $s->give_content("bar"); //调用了父类的方法
    echo "$s->bar is bar<br />"; //调用了父类的$bar属性
    
       ?>

    结果依然正常,运行显示:bar is bar,这说明问题和继承也没有关系。

    那么再回去看一下原来的程序,我将不相关的程序删除,程序可简化为:

     1 <?php
     2   class student
     3   {
     4       var $name;
     5       function set_data($arr)
     6       {
     7 
     8           $this->name=$arr["name"];
     9 
    10           }
    11           
    12 
    13       }
    14   
    15  class college_student extends student{} 
    16  $s=new college_student;
    17       $temparr=array("name"=>"lisa");
    18  
    19   $s->set_data($temparr);
    20 
    21    echo "$s->name的所在系<br />";
    22      
    23      
    24     ?>

    运行结果为:
    Notice: Undefined property: college_student::$name的所在系 in
    C:\xampp\htdocs\v\v.php on line 31

    这个有可能是数组造成的,如果不用数组赋值,程序为:

     1 <?php
     2   class student
     3   {      var $name;      }
     4   
     5  class college_student extends student{} 
     6  $s=new college_student;
     7 $s->name="lisa";
     8    echo "$s->name的所在系<br />";
     9      
    10      
    11     ?>

    问题依然存在,这说明不是数组的问题。

    上面代码第8行,如果在name后面加一个空格,那么结果可以正常运行,这说明,变量的调用后面不能直接接其它字符串。验证一下:

    <?php
    
    $bar = "bar";
    echo "$baris bar<br />"; //错误
    echo "$bar is$bar<br />"; //正常显示
    echo "$bar is $bar是错误。<br />"; //错误,
       ?>

    显示:

    Notice: Undefined variable: baris in C:\xampp\htdocs\v\v.php on
    line 14
    bar
    bar isbar

    Notice: Undefined variable:
    bar是错误。 in C:\xampp\htdocs\v\v.php on line 16
    bar is

    这说明,变量后面不能直接加字符串,否则会被php认为变量与字符串加在一起后,是另外一个变量。

  • 相关阅读:
    Spring中的Bean的配置形式
    使用外部属性文件配置Bean以及Bean的生命周期方法
    运行时找到main方法所在的类
    获取SpringMVC中所有RequestMapping映射URL信息
    RequestBody只能读取一次的问题
    接口标记为@ResponseBody却不进入ResponseBodyAdvice
    springboot打成jar包后无法解压
    Springboot打包执行源码解析
    关于base64的一个小细节
    Liquibase使用入门
  • 原文地址:https://www.cnblogs.com/4php/p/2798912.html
Copyright © 2020-2023  润新知