Correction status:qualified
Teacher's comments:
<?php header("content-type:text/html; charset=utf-8"); /*1.匿名对象与匿名类 匿名对象:没有对象的实例,直接使用该类 */ class books { private $bookName;//书名 private $number;//编号 private $arr_books_name = array();//书名收集数组临时存入 public function show_book_number( $bookName){ //展示书编号 $message = '';//返回消息 $number = '';//书对应的编号 $str_books_name = file_get_contents('books_name.txt');//取出文件中已经保存好编号的书名 $this->arr_books_name = explode('-',$str_books_name);//字符转数组 if(in_array($bookName,$this->arr_books_name)){ //首先查找传进来的书名在不在书名收集数组中,如果在则不用添加编号 $number = array_search($bookName,$this->arr_books_name); $message = '这本书的名字是:'.$bookName.'对应编号是'.$number;//返回消息 }else{ //如果不在将书名添加进书名收集数组,并输出当前数组的下标作为新书的编号 array_push($this->arr_books_name,$bookName); $number = array_search($bookName,$this->arr_books_name); //将数组转换为字符存入books_name.txt中 $str_name = implode('-',$this->arr_books_name); file_put_contents('books_name.txt',$str_name); $message = '这是本新书名字是:《'.$bookName.'》对应编号是'.$number; } return $message; } } //实例化对象 $book=new books(); echo $book->show_book_number('花和尚150'); //匿名对象 //echo (new books)->show_book_number('花和尚152'); //匿名类 //echo (new class {public function test(){return '这是匿名类';}})->test(); /*2.trait 类的声明与工作原理 trait类,似类非类,相当于方法集,当子类继承父类,且引用trait时,同名方法会执行trait类中的方法, 当子类中也有同样方法时,会执行子类自己的方法,优先级是子类>trait类>父类,trait类不可以实例化 但是可以有属性,如果子类引用trait类,同名属性会报错,解决办法是给同名属性都给ture,$name = ture; */ //基类 class Animal{ public function calls() { echo '1'; } } //trait类 //trait Bird{ // public $name = true; //public function calls() // { // parent::calls(); // echo '2'; //} //} //子类 class Eagle extends Animal{ public $name = true; // use Bird; } $oriole = new Eagle(); $oriole->calls();//此时会输出:2 /* 3.类自动加载 */ spl_autoload_register(function ($className){ require'./class/.'.$className.'php'; //存在命名空间时 //$className = str_replace("\\","/",$className); //require'./class/.'.$className.'php'; }); /* 4.对象的序列化:主要用在传输数据且不改变数据结构 当调用serialize()函数序列化对象时,该函数会检查类 中是否存在一个魔术方法__sleep()。 如果存在,该方法会先被调用,然后才执行序列化操作。 可以通过重载这个方法,从而自定义序列化行为 unserialize()反序列化函数用于将单一的已序列化的变量转换回 PHP 的值 如果传递的字符串不可解序列化,则返回 FALSE,并产生一个E_NOTICE 返回的是转换之后的值,可为integer,float、string、array或object 若被反序列化的变量是一个对象,在成功重新构造对象之后, PHP会自动地试图去调用__wakeup()成员函数(如果存在的话) */ $str = '看看'; echo serialize($str),'<br>'; $tmp = serialize($str); echo unserialize($tmp),'<br>'; $arr = array('note'=>'self','tag'=>'this'); $tmp_arr = serialize($arr); echo serialize($arr),'<br>'; print_r(unserialize($tmp_arr)); /*五.我对面向对象编程的理解 1.面向对象有三大特征:继承,封装,多肽 继承是指:类与类之间可以继承,但是必须是单一继承,就是一个爸爸可以有很多儿子, 但是一个儿子只有唯一的亲爸爸,子类可以继承父类的方法,但是private不可被继承, 也可以改写父类的方法,构建自己的属性。多肽是同一个类多样的表现形式。封装是提供外部接口, 尽可能隐藏实现细节,调用接口时,由一个个对象具体去实现功能。 2.面向对象编程可以提高代码的复用,减去代码冗余 3.面向对象可以使程序模块化,维护成本大大降低 4.在不改变内部结构时,外部通过继承,重写自己的方法,扩展性强 5.面向对象编程可以减少甚至避免各个代码块之间的数据相互影响 6.将现实事物抽象出一个类,提供接口,参数,返回数据, 将结构和数据隔离,打造一个功能强大的模板 7.面向对象的首先是对象的识别,其次是属性的识别,再是功能行为的识别 8.类与类之间相互不相互依赖,但是可以传递消息 9.面向对象是一个动态类型的语言,只有在执行过程中才加载 */ ?>
点击 "运行实例" 按钮查看在线实例