zoukankan      html  css  js  c++  java
  • laravel笔记

    ## 使用composer安装;
    composer create-project --prefer-dist laravel/laravel blog "5.8.*"  
    服务器满足要求:  
    PHP >= 7.1.3  
    OpenSSL PHP 拓展  
    PDO PHP 拓展  
    Mbstring PHP 拓展  
    Tokenizer PHP 拓展  
    XML PHP 拓展  
    Ctype PHP 拓展  
    JSON PHP 拓展  
    BCMath PHP 拓展  
    ## 目录结构:
    App-----包含了站点的controllers(控制器),models(模型),views(视图)和assets(资源)。这些是网站运行的主要代码,你会将你大部分的时间花在这些上面.  
    Bootstrap--------用来存放系统启动时需要的文件,这些文件会被如index.php这样的文件调用。  
    public ------这个文件夹是唯一外界可以看到的,是必须指向你web服务器的目录。它含有laravel框架核心的引导文件index.php,这个目录也可用来存放任何可以公开的静态资源,如css,Javascript,images等。  
    vendor ------用来存放所有的第三方代码,在一个典型的Laravel应用程序,这包括Laravel源代码及其相关,并含有额外的预包装功能的插件.

    ## 安装laravel提示插件:
    composer require barryvdh/laravel-ide-helper
    在config/app.php的providers中加入:
    BarryvdhLaravelIdeHelperIdeHelperServiceProvider::class,  
    之后运行:  
    php artisan ide-helper:generate

    ## 连接数据库:
    对于本地的开发环境,数据库配置文件 config/database.php 中的数据库相关配置就会随着 .env 文件中的对应配置项的改变而改变。而线上的生产环境中并没有 .env 文件,这样生产环境的数据库配置完全由 config/database.php 来决定。这也轻松实现了不同环境的不同配置。

    ## 一、首先配置路由:
    ```php
    // 文件位置:Routes/web.php  
    Route::get('',function(){});  
    Route::post('',function(){});  
    // 多路由,相应制定的路由  
    Route::match(['get','post'],'',function(){});  
    // 响应所有请求的路由  
    Route::any('',function(){});  
    // 路由参数  
    Route::any('/index/{参数名}',function(){});  
    // 路由参数必填  
    Route::any('/index/{id}',function($id){  
      echo 此参数为必填  
    });  
    // 路由参数可选  
    Route::any('/index/{id?}',function($id = 0){  
      echo 此参数为可选  
    });  
    ```
    > *通过?传的参数不需要路由;*  

    // 正则匹配  
    ```php
    Route::get('user/{name?}',function($name){  
        return $name;  
    })->where('name','[A-Za-z]+');  
    // 路由别名  
    Route::get('user/center',['as'=>'center',function(){  
        return route('center');  
    }])  
    Route::any('/test',function(){
      echo '当前别名';
    })->name('名字');
    // 路由群组  
    Route::group(['prefix'=>'admin'],function(){
      //增加前缀
      Route::get('/users',function(){
        echo "匹配的admin/users这个URL";
      });
    });
    // 视图  
    Route::get('/', function () {  
        return view('welcome');  
    });  
    // 控制器路由  
    Route::get('/','IndexController@index');
    ```
    查看系统路由 php artisan route:llist

    ## 二、控制器
    位置:app/Http/Controllers  
    命名方式:大驼峰的控制器名+Controller.php 如:GoodController.php  
    使用artisan命令创建控制器:  
    PHP artisan make:controller 控制器名字(TestController)
    控制器路由:路由规则调用控制器的方法;  
    Route::get('/','IndexController@index');  
    支持分目录管理:
    ```php
    Route::get('/','HomeIndexController@index');
    Route::get('/admin/index/index','AdminIndexController@index');
    ```

    ## 接受用户输入
    接受用户输入的类:IlluminateSupportFacadesInput  
    ```php
    Input::get('参数的名字','如果参数没有被传递使用该默认值');
    Input::all(); 获取所有的用户的输入
    Input::get(''); 获取单个的用户的输入
    Input::only([]); 获取指定几个用户的输入
    Input::except([]); 获取指定几个用户的输入以外的所有的参数
    Input::has('name'); 判断某个输入的参数是否存在
    ```
    如果需要使用别名引入类;----在config/app.php中创建别名;  
    dd()相当于var_dump();-----格式会处理dump+die;    
    不仅仅input可以获取;Request方法也可以获取;


    ## 三、模型(AR模型)
    如app/user.php  
    php artisan make:model member  
    每张数据表都对应一个与该表进行交互的“Model模型”;  
    建议分目录进行管理

    * 建立好模型后,将模型与表进行对应:
      * (必选)$table属性,如果不指定默认对应复数表member-----members
      * (可选)$primaryKey属性,主键名称,
      * (可选)$timestamps属性,false;如果不设置false,会生成created_at和updated_at字段
      * (可选)$fillable属性,插入数据时,允许插入数据库的字段
    * 控制器中引入模型:
    use 命名空间模型名;
    * 使用方法:
      ```php
      * Member::get();
      * $model = New Member(); $model->get();
      ```
    * 添加操作:
      * AR模式
      ``` php
      $model = New Member();
      $model->age = '21'; //字段赋值
      $model->save(); //保存记录
      ```
      * 使用creat方法
      ```php
      Member::create($request->all());
      $model->create($request->all());
      ```
      * request类的使用,需要通过形参的方式接受;与input方法类似
      ``` php
      public function test(Request $request){
        $request->all(); //
        $request->input('name');
        $request->only(['name1','name2']);
        $request->except(['name1','name2']);
        $request->has('name');
        $request->get('name');
      }
      ```
    * 查询操作
      * 通过主键获取一条数据
      ``` php
      $res = Member::find(3);//通过主键获取一条数据,结果没对象;
      $res = $res->toArray(); //将结果集转成数组形式,此方法是laravel自带的
      ```
      * 获取指定条件的第一条数据
      ``` php
      $res = Member::where("id",">",3)->first();//通过主键获取一条数据,结果没对象;
      ```
      * 查询多行并指定字段
      ``` php
      $res = Member::all();//all方法不支持链接其他的辅助方法
      $res = Member::where('id','>',2)->get([]);
      $res = Member::where('id','>',2)->select([])->get([]);
      ```
    * 修改操作
      * 首先通过find()方法查询到此数据,然后修改之后save();
      * 使用update()方法;
      ```php
      Member::where('id',22)->update([]);
      ```
    * 删除操作
      * 首先通过find()找到数据,然后使用delete()方法删除;
      * 通过DB方法删除也是可以
      ```php
      Member::where('id',2)->delete();
      ```

    ## 四、数据库
    提供了DB facade(原始查找)、*查找构造器、Eloquent ORM三种操作方法  
    构造器自增自减: 
    ```php 
    DB::table('student')->increment('字段');  
    DB::table('student')->decrement('字段');  
    ```
    Eloquent ORM是一个优美简洁的ActiveRecord实现数据库操作,每个数据的表都对应模型model  
    // DB类操作  
    navicat中的F6命令行  
    #### 增加方法:
    insert();可以同时增加一条或多条,返回值是布尔类型;  
    insertGetId(),只能增加一条数据,返回自增ID;  
    ```php
    DB::table('无前缀表名')->insert(['name'=>'zhangsan','sex'=>0]);//单条数据;  
     DB::table('无前缀表名')->insert([  
      ['name'=>'zhangsan','sex'=>0],  
      ['name'=>'zhangsan','sex'=>0]  
    ]);//多条数据;   
    $id = DB::table('无前缀表名')->insertGetId(['name'=>'zhangsan','sex'=>0]);//单条数据;  
    ```
    #### 更新方法:  
    update([]); 更新所有的字段,返回值为受到影响的行数;  
    increment('字段',值)--递增; decrement()--递减;  只是修改某个字段  
    where('字段','运算符','值')如果运算符为‘=’,可以不写  
    ```php
    DB::table('无前缀表名')->where('id','2')->update(['name'=>'张三丰']);
    ```
    #### 查询方法:
    * 取出基本数据
    DB::table('表')->get() 相当于:select * from 表;
    返回值为集合对象  
    获取循环数据:  
    ```php
    foreach($res as $k=>$v){  
      echo $v->id;  //此处是对象,不是数组  
    }
    ```
    配合where()方法,还有'或者'关系:orWhere()
    ```php
    DB::table('表')->where()->orWhere()->get();
    ```
    * 取单行数据  
    first()方法:返回值是一个对象;等价于limit 1;
    ```php
    DB::table('表')->first();
    ```
    * 取出某一行的某一个值
    value()方法;
    ```php
    DB::table('表')->where('id','2')->value('name');
    ```
    * 获取某些字段的值  
    select()方法;
    ```php
    DB::table('表')->where('id','2')->select('name','sex')->get();
    ```
    设置别名:
    ```php
    DB::table('表')->where('id','2')->select('name as na','sex')->get();
    ```
    排序操作:orderBy('name','desc')
    分页操作:
    limit():限制输出条数;
    offset(n):从第n+1条开始;
    #### 删除操作(工作中使用修改代替删除)
    物理删除,逻辑删除;  
    delete():删除记录;返回的是影响的数据;  
    truncate():清空整个数据表;  
    ```php
    DB::table('表')->where('id','2')->delete();
    ```

    #### 执行任意的SQL语句
    * 执行任意的insert、update、delete语句
    DB::statement('');
    * 执行任意的select语句
    DB::select('');
    -----------------------------------------
    ## 五、视图
    * 创建(最好创建目录管理)命名方式:  
    新建视图:resources/views/XXXX.blade.php
    使用blade.php可以使用{{$title}}方法,也可使用PHP原生语法  
    如果使用.php只能使用PHP原生语法  
    优先展示blade.php文件  
    * 展示视图的方法(可以分目录挂你)  
    控制器中加载视图;return view('home/test');  
    最好,一个控制器对应一个视图文件夹;  
    return view('home.test');  
    * 变量的分配和展示,将控制器中的变量分配到view中;  
    view(模板文件名称,数组);  
    view(模板文件名称)->with(数组);  
    view(模板文件名称)->with(名称,值)->with(名称,值)  
    * 使用compact方法进行参数传递,是php内置函数  
    compact('变量名1','变量名2'); 返回一个变量名和变量的数组;  
    ```php
    $firstname = "Peter";  
    $lastname = "Griffin";  
    $age = "41";  
    $name = array("firstname", "lastname");  
    $result = compact($name, "location", "age");//结果:Array ( [firstname] => Peter [lastname] => Griffin [age] => 41 ) 
    ```
    * 模板中使用函数{{函数名}}  
    函数可以是PHP内置,也可是框架定义的  
    * 循环与判断标签  
    ```html
    @foreach($arr as $k=>$v)  
      {{$v->id}}   
    @endforeach

    @if(条件表达式1)  
    @elseif(条件表达式2)  
    @else  
    @endif  
    ```

    * 模板继承  
      * 父级中设置:  
    @yield('content','主要内容');-------------占位符  
      * 子模板:  
    @extends('需要继承的父级模板');--------------继承  
    @section('content');  
    @endsection  

    * 基本使用和include();  
    @include('student.common',['aa'=>'asssss']);---引用其他模板,可以传变量

    * 外部静态文件的引入(js/css/image)  
    静态文件放到public下的文件/,使用根目录  
    或者使用asset()方法{{asset('css/app.css')}}  

    ## 六、CSRF攻击--跨站请求伪造  
    默认是开启的,所有的表单提交都需要有;  
    视图中增加一个csrf_token  
    ```html
    <input type="hidden" name="_token" value="<?php echo csrf_token() ?>">  
    ```
    此隐藏域等价于此函数:csrf_field();    

    * 全局关闭csrf:
    在app/Http/Kernel.php文件中有如下配置: 
    注释掉// AppHttpMiddlewareVerifyCsrfToken::class  
    * 局部关闭:
    修改appHttpMiddlewareVerifyCsrfToken.php
    $except中设置不用做验证的路由
    例如:'/home/*'表示排除home下的所以路由;

    ## 七、自动验证(重点)

    * 验证方式一:(控制器验证)
    Input::method()得到获取方法;
      ```php
      public function valite(Request $request){
        $this->validate($request,[
          'title' => "required" //验证的规则,多个规则通过“|”隔开
        ]);
      }
      ```
    如果验证不通过会重定向返回原来的页面;  
    常用的规则有:    
    错误信息的输出:从session中获取错误信息;$errors变量中;可以直接在视图中显示  
      ```html
      @if(count($errors)>0)
        @foreach($errors->all as $error)
        {{$error}}
        @endforeach
      @endif
      ```
    错误信息的转成中文,需要下载对应的语言包;网址:[https://packagist.org] laravel-lang  
    将下载的语言包放到resources/lang/  
    修改config/app.php中的配置项:'locale' => 'zh-CN',如果没有的直接修改语言包  

    # 其他工具使用说明
    ## 文件上传
    * 在http请求中,使用file()方法
    ```php
      public function tofile(Request $request){
        $file = $request->file('photo');
        // 或者使用下面方法:
        $file = $request->photo;
        // 判断是否有文件存在
        $isok = $request->hasFile('photo');
        // 验证文件是否上传成功
        $isok = $request->file('photo')->isValid();
        // 使用move(目录,文件名)方法保存文件
        $path = md5(time().rand(100000,999999)).'.'.$request->file('photo')->getClientOriginalExtension()
        $request->file('photo')->move('./uploads',$path);
      }
    ```
    ## 数据分页
    * 直接调用模型中的分页方法;Paginator.php
    在数据库中分页中说明
    ```php
      $data = Member::paginate(12);// 每页显示的条数,语法类似get()方法;
      $data -> links(); // 分页数,其他类函数说明
    ```

    ## 验证码
    * 安装扩展包:composer require mews/captcha  
    如果需要其他版本,可以在composer.json中添加版本,然后更新  
    ```json
    {
      "require":{
        "mews/captcha":"^2.3.0"
      }
    }
    ```
    使用composer update 更新
    * 修改配置config/app.php
    ```php
      'providers' => [
        MewsCaptchaCaptchaServiceProvider::class,
      ],
      'aliases' => [
        'Captcha' => MewsCaptchaFacadesCaptcha::class,
      ],
    ```
    如果想用自己配置文件可以  
    php artisan vendor:publish 生成自己的config/captcha.php配置文件  
    * 应用:使用captcha_img();根据扩展中的函数进行使用;
    * 验证:validator(['captcha'=>"required|captcha"]);

    ## 八、数据表的迁移和填充
    * 迁移:创建数据表和删除数据表的操作;
      * 迁移文件的位置:database/migrations
      * 创建迁移文件:php artisan make:migration 迁移文件名
        php artisan make:migration create_paper_table //创建表
      * 编写迁移文件:
        ```php
        // 创建表
        public function up()
        {
            Schema::create('paper', function (Blueprint $table) {
              // $table->列类型方法(字段名,[长度/值范围])->列修饰方法();
                $table->bigIncrements('id');
                $table->timestamps();
            });
        }
        // 删除表
        public function down()
        {
            Schema::dropIfExists('paper');
        }
        ```
      * 运行迁移:
       * 当前项目第一次执行迁移文件:php artisan migrate:install 生成一个迁移表(高版本可以省略)
       * 需要执行up()方法:php artisan migrate
       * 需要执行down()方法:php artisan migrate:rollback;删除的是同批次;最新批次的表;
    * 填充:往数据表了填充写入测试数据;
      * 填充器位置:database/seeds
      * 创建填充器:php artisan make:seeder 填充器名称【大写表名+TableSeeder】
      * 编辑填充器:
        ```php
        public function run()
        {
            $data = [
              [
                'name' => '姓名'
              ],
            ];
            //写入数据,建议使用DB方法
            DB::table('paper')->insert($data);
        }
        ```
      * 执行填充器文件:php artisan db:seed --class=PaparTableSeeder
    ## 项目初始化
      * 创建laravel项目
      * 建立数据库
      * 设置本地化为中文
      * 设置项目时区(Aisa/shanghai、Aisa/chongqing、PRC)
      * 清理项目(删除不需要的文件)
        * app/Http/Controllers/Auth
        * database/migrations/下的文件表
        * database/seeds下的文件
        * resources/views/welcome.blade.php
        * public下的css、js文件也可删除
      * 关闭Mysql严格模式
        config/database.php将static改为false
        * 不支持对not null字段插入null
        * 不支持对自增长字段插入“”值
        * 不支持对text字段有默认值
      * 安装debuger工具条(可选)
        PHP版本>=7.0; 下载

    ### ajax
      * return json_encode($data);
      * return response()->json($data);
    ### 跳转响应
      * return redirect(路由);
      * return redirect()->to(路由);
    ### 会话控制
      * session 文件位置:storage/framework/sessions
      ```php
      use IlluminatesupportfacadesSession;
      Session::get('key');
      Session::put('key','value');
      Session::all(); // 获取所有变量
      Session::has('key');
      Session::forget('key');   //删除一个变量
      Session::flush(); //删除所有变量
      ```
    ### 缓存操作
      * 配置在config/cache.php  文件位置:storage/framework/cache/data
      * 支持的后端缓存Memcached 和 Redis 等
      ```php
      use IlluminatesupportfacadesCache;
      // 设置缓存;有效期必须设置,单位是分钟
      Cache::put('key','value',$minutes);
      // 获取缓存数据
      Cache::get('key');
      // 获取缓存数据,如没有加默认值
      Cache::get('key','default');
      // 获取缓存数据,如没有通过回调函数
      Cache::get('key',function(){
        return 'default';
      });
      // 只有在缓存项不存在是才添加数据到缓存,返回true,否则false
      Cache::add('key','value',$minutes);
      // 获取缓存项并删除
      Cache::pull('key');
      // 持久化存储数据到缓存,需要通过forget方法手动移除
      Cache::forever('key','value');
      // 移除缓存数据
      Cache::forget();
      // 判断缓存是否存在
      Cache::has('key');
      // 清除所有缓存,并删除目录
      Cache::flush();

      // 缓存数据的增加和减少
      Cache::increment('key');
      Cache::increment('key',$amount);
      Cache::decrement('key');
      Cache::decrement('key',$amount);

      // 获取某缓存但是没有的话给个默认值并存储
      Cache::remember('key',$minutes,function(){
        return 'ssss';
      });
      Cache::rememberForever('key',function(){
        return 'ssss';
      });
      ```
    ### 联表查询
    * 多表联合查询:
    ```php
      DB::table('author as 别名')->join('表名 as 别名','表1字段','运算符','表2字段')->get();
      // leftJoin 和 rightJoin
      DB::table('author')->leftJoin('表名','表1字段','运算符','表2字段')->get();
      // crossJoin 交叉连接在第一个表和被连接的表之间会生成笛卡尔积
      DB::table('author')->crossJoin('colours')->get();
    ```
    * 关联模型:
    * 创建对应的模型:
    * 需要将关联的方法放到主模型中;
    * 定义好关联方法
    ```php
    // 模型的关联方法:分析谁关联谁,
    public function gl(){
      // 一对一关联关系
      return $this->hasOne('需要关联模型的命名空间模型名','被关联模型的字段','此模型的字段');
    }
    public function comments(){
        // 一对多
      return $this->hasMany('需要关联模型的命名空间模型名','被关联模型的字段','此模型的字段');  
    }
    public function keyword(){
      // 多对多,一个文章对多个关键词,一个关键词对多个文章;需要第三章关联表;
      return $this->belongsToMany('需要关联模型的命名空间模型名', '关系表名', '当前模型连接表里的外键名', '被关联模型连接表里的外键名');
    }
    ```
    * 使用方法
    ```php
    // 一对一关联关系
    echo User::find(1)->gl->title;//此处的关联就是模型中的方法;title是被关联模型的字段
    // 一对多
    $data = User::get();
    foreach($data as $k=>$v){
      echo $v->id;
      $comment = $v->comments;
      foreach($comment as $kk=>$vv){
        echo $vv->content;
      }
    }
    // 多对多
    $data = Article::get();
    foreach($data as $k=>$v){
      echo $v->id;
      $keys = $v->keyword;
      foreach($keys as $kk=>$vv){
        echo $vv->content;
      }
    }
    ```



    Artisan 是 Laravel 中自带的命令行工具的名称。  
    php artisan make:controller MsgController  创建控制器  
    php artisan tinker 进行测试  
    php artisan list 查看所有的命令  
    Usage:  
      command [options] [arguments]  

    Options:  
      -h, --help            Display this help message //显示此帮助消息  
      -q, --quiet           Do not output any message //不输出任何消息  
      -V, --version         Display this application version //显示此应用程序版本  
          --ansi            Force ANSI output  
          --no-ansi         Disable ANSI output  
      -n, --no-interaction  Do not ask any interactive question  
          --env[=ENV]       The environment the command should run under  
      -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 f  

    Available commands:  
      clear-compiled       Remove the compiled class file //删除编译后的类文件  
      down                 Put the application into maintenance mode //使应用程序进入维护模式  
      dump-server          Start the dump server to collect dump information. //启动转储服务器来收集转储信息  
      env                  Display the current framework environment //显示当前框架环境  
      help                 Displays help for a command  //显示命令的帮助  
      inspire              Display an inspiring quote //引用鼓舞人心的话  
      list                 Lists commands //列表命令  
      migrate              Run the database migrations //运行数据库迁移  
      optimize             Cache the framework bootstrap files //缓存框架引导文件  
      preset               Swap the front-end scaffolding for the application //将前端支架替换为应用程序  
      serve                Serve the application on the PHP development server //在PHP开发服务器上提供应用程序  
      tinker               Interact with your application //与应用程序交互  
      up                   Bring the application out of maintenance mode //使应用程序脱离维护模式  
     app  
      app:name             Set the application namespace //设置应用程序名称空间  
     auth  
      auth:clear-resets    Flush expired password reset tokens //刷新过期的密码重置令牌  
     cache  
      cache:clear          Flush the application cache //刷新应用程序缓存  
      cache:forget         Remove an item from the cache //从缓存中删除一个项  
      cache:table          Create a migration for the cache database table //为缓存数据库表创建迁移  
     config  
      config:cache         Create a cache file for faster configuration loading //创建一个缓存文件,以便更快地加载配置  
      config:clear         Remove the configuration cache file //删除配置缓存文件  
     db  
      db:seed              Seed the database with records //用记录种子数据库  
     event  
      event:cache          Discover and cache the application's events and listeners //发现并缓存应用程序的事件和侦听器  
      event:clear          Clear all cached events and listeners //清除所有缓存的事件和侦听器  
      event:generate       Generate the missing events and listeners based on registrati //基于registrati生成缺少的事件和侦听器  
      event:list           List the application's events and listeners //列出应用程序的事件和监听器  
     ide-helper  
      ide-helper:eloquent  Add Eloquent helper to EloquentModel //将“有说服力”助手添加到“有说服力”模型中  
      ide-helper:generate  Generate a new IDE Helper file. //生成一个新的IDE帮助文件。  
      ide-helper:meta      Generate metadata for PhpStorm //为PhpStorm生成元数据  
      ide-helper:models    Generate autocompletion for models //为模型生成自动完成  
     key  
      key:generate         Set the application key //设置应用程序键  
     make  
      make:auth            Scaffold basic login and registration views and routes //脚手架基本的登录和注册视图和路由  
      make:channel         Create a new channel class //创建一个新的channel类  
      make:command         Create a new Artisan command //创建一个新的Artisan命令  
      make:controller      Create a new controller class //创建一个新的控制器类  
      make:event           Create a new event class //创建一个新的事件类  
      make:exception       Create a new custom exception class //创建一个新的自定义异常类  
      make:factory         Create a new model factory //创建一个新的模型工厂  
      make:job             Create a new job class //创建一个新的job类  
      make:listener        Create a new event listener class //创建一个新的事件监听器类  
      make:mail            Create a new email class //创建一个新的email类  
      make:middleware      Create a new middleware class //创建一个新的中间件类  
      make:migration       Create a new migration file //创建一个新的迁移文件  
      make:model           Create a new Eloquent model class //创建一个新的有说服力的模型类  
      make:notification    Create a new notification class //创建一个新的通知类  
      make:observer        Create a new observer class //创建一个新的观察者类  
      make:policy          Create a new policy class //创建一个新的policy类  
      make:provider        Create a new service provider class //创建一个新的服务提供者类  
      make:request         Create a new form request class //创建一个新的表单请求类  
      make:resource        Create a new resource //创建新资源  
    /public"  
     vendor  
      vendor:publish       Publish any publishable assets from vendor packages //发布来自供应商包的任何可发布资产  
     view  
      view:cache           Compile all of the application's Blade templates //编译应用程序的所有刀片服务器模板  
      view:clear           Clear all compiled view files //清除所有已编译的视图文件  
  • 相关阅读:
    每天一个linux命令
    Python 面向对象-下篇
    Python 面向对象-上篇
    何时会发生隐式类型转换
    C++类型检查
    无符号保留原则
    bool类型为什么可以当做int
    在类的外部定义成员函数注意形式
    局部类
    命名规范
  • 原文地址:https://www.cnblogs.com/ziyandeyanhuo/p/12023863.html
Copyright © 2011-2022 走看看