博客列表 >匿名对象,匿名类+trait类+类的自动加载—+对象的序列化和反序列化+面向对象编程的理解

匿名对象,匿名类+trait类+类的自动加载—+对象的序列化和反序列化+面向对象编程的理解

罗盼的博客
罗盼的博客原创
2018年09月06日 20:13:13773浏览

实例

<?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.面向对象是一个动态类型的语言,只有在执行过程中才加载
*/



?>

运行实例 »

点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议