批改状态:合格
老师批语:
<?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.面向对象是一个动态类型的语言,只有在执行过程中才加载
*/
?>点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号